標準モジュールとシートモジュールの違い
エクセルVBAを始めたばかりの人に教えるとき、
まずは標準モジュールを挿入して、そこに書きましょう、と教えます。
しかし後で見ると、時に間違ってシートモジュールに書いている場合が結構あります。
「何が違うんですか?」
「どこが違うんですか?」
そういう時は、
「今はその違いについて説明しても混乱するだけですから、とにかく標準モジュールに書いてください。」
このようにお伝えすることが結構あります。
イベント処理等でシートモジュールを扱うようになったら、その違いは正確に理解しておかなければなりません。
以下では、標準モジュールとブックモジュールとシートモジュールの違いを列挙的に説明します。
用語的には、若干の独自補正を加えています。
なぜなら、正式用語を羅列しても理解しづらく、それで理解できる人にはそもそも説明が不要だからです。
書かれている場所と概要
ブック内に自由に挿入・削除できます。
いくつでも挿入できますし、無くても構いません。
初期名称は「ThisWorkbook」
ブック内に一つだけです。
シートと一対一の関係です。
シートを削除すれば、シートモジュールも削除されてしまいます。
シートモジュールはシートに属しています。
つまり、シートをコピーすれば、シートモジュールも一緒にコピーされます。
これを逆手にとって、シートモジュールに意図的に記述することで、他のブックにマクロVBAをコピーすることもできます。
シートを省略してRangeやCellsと記述した時
つまり、
Range("A1") = 1
Cells(2,1) = 2
このように書いた場合です。
もちろん、ブック・シートで修飾していれば、それらは同じ動作になります。
そして、本来はブック・シートはしっかり指定すべきす。
ThisWorkbook.Worksheets("Sheet1").Range("A1")
つまり、基本通りにブック・シートを指定していれば、この違いはあまり気にする必要はありません。
他モジュールから使う時
もちろん、Privateは他のモジュールからは使用できません。
Public 変数hoge
これを他のモジュールで使用する時は、
変数hoge
とだけ記述すれば使用できます。
ThisWorkbookの、
Public 変数hoge
これを他のモジュールで使用する時は、
ThisWorkbook.変数hoge
と記述する必要があります。
Sheet1の、
Public 変数hoge
これを他のモジュールで使用する時は、
Sheet1.変数hoge
と記述する必要があります。
第108回.変数の適用範囲
デバッグ時の違い
VBAの当該行が黄色反転表示されます。
シートモジュール
初期値の
「エラー処理対象外のエラーで中断」
この状態の時に、上で書いたような違いが発生します。
「クラスモジュールで中断」または「エラー発生時に中断」にしてあれば、
上のエラー時のメッセージでの「デバッグ」押下はどちらも同じになります。
標準モジュールとシートモジュールの使い分け方
そもそも標準と言う言葉があまりにも曖昧に感じられて混乱しやすいのだと思います。
そのオブジェクトに付帯しているモジュールなので、オブジェクトモジュールという言い方もします。
・一緒にしておいた方が良い処理
オブジェクトモジュールには、これらの処理を記述します。
代表的なものが、イベントプロシージャーになります。
イベントプロシージャーは、当該オブジェクトのモジュールに書かなければならず、オブジェクトと切り離すことのできない処理になります。
多くの処理がシートに依存していることになり、やたらとシートモジュールに書くことになってしまいます。
そもそも、ほとんどはブックに依存しているので、全てブックモジュールに書くことになってしまいますよね。
つまり、
オブジェクトと一体としてそこに無ければならない処理なのかが判断基準になってくるでしょう。
簡単に考えるなら、シートをコピーした時を想定してみると良いでしょう。
シートをコピーすれば、シートモジュールもコピーされます。
例えば、イベント処理として、
Private Sub Worksheet_Change(ByVal Target As Range)
'・・・
'いろいろな処理
'・・・
End Sub
このSheet1をコピーしてSheet2を作成した時、このシートモジュールも全てコピーされます。
上記のイベント処理も当然コピーされますが、それはむしろ都合が良いでしょう。
しかし、
「いろいろな処理」この記述も含めてそれぞれのシートに存在することになります。
この「いろいろな処理」が数十行のVBAで書かれていたとしたらどうでしょうか。
いったんは問題ないでしょうが、何かの変更が発生したら、、、
ではどうしたら良いか。
「いろいろな処理」の部分は標準モジュールに記載して、
イベントプロシージャーからはCallするような作りにしておくことを考えるべくでしょう。
(当然Tagetを直接または加工して引数として渡すことになります。)
この時にも、シートのコピーは常に念頭に置いて考えるべきです。
もちろん、
シートをコピーすることが無いといった場合や、
それぞれのシートにVBAが存在している事の是非については、
個別の判断が必要になることは言うまでもありません。
・複数オブジェクトから汎用的に使用される処理
上記以外でも、オブジェクトモジュールに記載する処理以外は全てここに書きます。
ここは見解がいろいろありそうですが、
イベント処理を覚えるまでは、まずは標準モジュールだけ使う事をお勧めしておきます。
それらは、イベント処理くらいまで習得した後に考えれば良いと思います。
同じテーマ「マクロVBA技術解説」の記事
Rangeオブジェクト.Valueの省略について
シート保護でユーザー操作を制限する
シートに数式を設定する時のセル参照の指定方法
標準モジュールとシートモジュールの違い
オートフィルタ(AutoFilter)の使い方まとめ
複雑な条件(複数除外等)のオートフィルター(AutoFilter)
クリップボードを使わないセルのCopy
Rangeの使い方:最終行まで選択を例に
フルパスをディレクトリ、ファイル名、拡張子に分ける
Colorプロパティの設定値一覧(カラー定数、XlRgbColor列挙)
VBAを定型文で覚えよう
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- 標準モジュールとシートモジュールの違い
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。