[[20180520052258]] 『標準モジュールとシートに書くプログラムの使い分』(kon) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『標準モジュールとシートに書くプログラムの使い分けについて』(kon)

いつもお世話になっています。

VBA初心者でたまにしか作成していないレベルのものです。

いつもシート状にボタンを作り、そこに標準モジュールで作ったプログラムを「マクロを登録」で動かしています。

ボタンを複数個にすると、カッコよく使いやすい配置にできなくて、今回は各シートのセルをクリックやダブルクリックすると、そのシートに書いたプログラムが動く…といったものを作ってみたのですが、機能を追加していくうちに、標準モジュールで作ったものを呼び出して動かしたくなりました。

シートに標準モジュールのプログラムを書き加えると、どっちがどっちかわからなくなりそうだし、文面が長くなってしまうと思うので、標準モジュールのものをクラス化(?一つの機能とする?)して呼び出そうと考えています。

このような場合のサンプル的なサイトがあれば教えていただけないでしょうか?

バージョン:Excel2007〜2010

OS:win7〜win10

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 vba コード設計 。。。検索
たくさん、いろいろ、ありますよ。  ^^ でわ
ボタン。。。位置をセルのサイズに合わせるときれいに(機械的な並び方?)ならびますよ。
(隠居じーさん) 2018/05/20(日) 08:18

ちょっと状況がわかりません。

>シート状にボタンを作り、そこに標準モジュールで作ったプログラムを「マクロを登録」で動かしています。
たぶん「フォームコントロール」をシート上に配置して「マクロの登録」で標準モジュールに記述したマクロを動かすようにしてる。ということだとおもいます。

>シートのセルをクリックやダブルクリックすると、
こちらはシートイベントの話ですよね。
シートのイベントなので、通常はシートイベントに記述します。
たとえば、ダブルクリックならこんな感じ

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
        MsgBox "シートモジュールに記述したもの"
    End Sub

>今回は各シート
ブック内の全シートに同じ【シート】イベントを適用したいという意味であればですが、
各シートが属するブック、つまり「ThisWorkbook」モジュールに以下のように記述します。

    Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
        MsgBox "ThisWorkbookモジュールに記述したもの"
    End Sub

>シートに標準モジュールのプログラムを書き加えると、どっちがどっちかわからなくなりそうだし、
>文面が長くなってしまうと思うので、標準モジュールのものをクラス化(?一つの機能とする?
>)して呼び出そうと考えています。
よくわからないですが、
【ThisWorkbookモジュール】

    Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
        Cancel = True
        Call test1
    End Sub

【標準モジュール】

    Sub test1()
        MsgBox "テストです"
    End Sub

こんな感じにしたいのでは?
となるとクラス化とは別のお話な気がするんですが違いますかね。

本当にクラスについて聞きたいのであれば、クラスモジュールに記述することになるとおもうんですが、そちらは勉強中なので私には説明できるほどのスキルがないためわかりません。

ちなみに、ボタンの配置の話であれば、普通のシェイプと同じように
Ctrlキーを押しながら、複数選択した状態で
「ページレイアウト」タブ→「配置」リボン→「配置」アイコンのところにある▼で
「左揃え」とか「上下に整列」なんて選ぶときれいに配置できるとおもいます。

(もこな2) 2018/05/20(日) 11:43


すみません。誤字りました。

誤 通常はシートイベントに記述します。
正 通常はシートモジュールに記述します。
(もこな2) 2018/05/20(日) 15:53


 >シートに標準モジュールのプログラムを書き加えると、
 >どっちがどっちかわからなくなりそうだし、文面が長くなってしまうと思うので、
 >標準モジュールのものをクラス化(?一つの機能とする?)して呼び出そうと考えています。

別にクラス化しなくても、
「個人用マクロブックに、よく使うマクロを登録しておいて、
それをシートモジュールから呼び出す。」
というようなことでもよいでしょう。

>このような場合のサンプル的なサイトがあれば教えていただけないでしょうか?
なんでだろー。
ちらっと探してみたんですけど、屁理屈みないな記述は見つかりますが、
具体的な動かせるサンプルとともに解説しているサイトは、
見つかりませんでした。

まず、新規ブックに標準モジュールを挿入します。
で、以下のコードを記述します。

Public Sub test(ByVal Rng As Range)

    MsgBox Rng.Address(False, False, xlA1, True) & " をクリックしました。"
End Sub

で、このコードをセルをダブルクリックしたときに利用したいなら、
例えばSheet1のモジュールに、

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    Module1.test Target
    Cancel = True
End Sub

と書いて他のひょーじゅんモジュールのプロシージャを呼び出せます。
同じように別ブックのプロシージャも、そのブックが開いていれば、
ブックから指定すれば呼び出せると思います。(試してないですが^^;)
これで用は足りると思いますが、
もう一歩進んで、
クラスモジュールに自作の関数群をまとめるようなことをしたいのですか?

多分、それくらいのことなら、同じようにクラスモジュールに、
Publicでプロシージャを書けば、同じように呼び出せるとは思いますが、
個人的に興味がないので、いまのとここちらで勉強してまで、
回答する気はないので、他の方の回答をお待ちください。

とりあえず、自分でわかる範囲での回答となります。
ヒントは出しましたので、試行錯誤をされることを望みます。
そのうえで、また上手くいかなかったら、また聞いてください。

もし、解決に至りそうにないなら、またお手伝いできることは手伝えると思います。
(まっつわん) 2018/05/21(月) 08:49


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.