標準モジュールとシートモジュールの違い
エクセル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 ・・・新着記事一覧を見る
第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方
|生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する!
|生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- 標準モジュールとシートモジュールの違い
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。