ExcelマクロVBA技術解説
標準モジュールとシートモジュールの違い

ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
最終更新日:2019-10-26

標準モジュールとシートモジュールの違い


エクセルVBAを始めたばかりの人に教えるとき、
まずは標準モジュールを挿入して、そこに書きましょう、と教えます。
しかし後で見ると、時に間違ってシートモジュールに書いている場合が結構あります。


そういう時に、必ず聞かれるのが、
「何が違うんですか?」
「どこが違うんですか?」
そういう時は、
「今はその違いについて説明しても混乱するだけですから、とにかく標準モジュールに書いてください。」
このようにお伝えすることが結構あります。

とはいえ、
イベント処理等でシートモジュールを扱うようになったら、その違いは正確に理解しておかなければなりません。
以下では、標準モジュールとブックモジュールとシートモジュールの違いを列挙的に説明します。
用語的には、若干の独自補正を加えています。
なぜなら、正式用語を羅列しても理解しづらく、それで理解できる人にはそもそも説明が不要だからです。

書かれている場所と概要

標準モジュール
ブックに属しています。
ブック内に自由に挿入・削除できます。
いくつでも挿入できますし、無くても構いません。
ブックモジュール
ブックに属しています。
初期名称は「ThisWorkbook」
ブック内に一つだけです。

シートモジュール
シートに属しています。
シートと一対一の関係です。
シートを削除すれば、シートモジュールも削除されてしまいます。


シートモジュールだけがシートに属しています。
つまり、シートをコピーすれば、シートモジュールも一緒にコピーされます
これを逆手にとって、シートモジュールに意図的に記述することで、他のブックにマクロVBAをコピーすることもできます。

シートを省略してRangeやCellsと記述した時

VBAの書き方として、シート修飾せずに、いきなりRangeやCellsから書き始めた場合。
つまり、
Range("A1") = 1
Cells(2,1) = 2

このように書いた場合です。

標準モジュール
アクティブブックのアクティブシートのセル
ブックモジュール
アクティブブックのアクティブシートのセル
シートモジュール
シートモジュールが記述されているシートのセル

もちろん、ブック・シートで修飾していれば、これらは同じ動作になります。
そして、本来はブック・シートはしっかり指定すべきす。
Worksheets("Sheet1").Range("A1")
つまり、基本通りにブック・シートを指定していれば、この違いはあまり気にする必要はありません。

他モジュールから使う時

Public指定の変数やプロシージャーを他のモジュールで使う時の記述の違いです。
もちろん、Privateは他のモジュールからは使用できません。

標準ジュール
全てのモジュールでそのまま使用可能
Public 変数hohe
これを他のモジュールで使用する時は、
変数hoge
とだけ記述すれば使用できます。
ブックモジュール
常にオブジェクト名で修飾する必要があります。
ThisWorkbookの、
Public 変数hohe
これを他のモジュールで使用する時は、
ThisWorkbook.変数hoge
と記述する必要があります。
シートモジュール
常にオブジェクト名で修飾する必要があります。
Sheet1の、
Public 変数hoge
これを他のモジュールで使用する時は、
Sheet1.変数hoge
と記述する必要があります。

以下も参照してください。
第108回.変数の適用範囲
変数には、その変数をVBA内で使う事ができる範囲が決められています。マクロVBAでは変数の使える範囲を、適用範囲(スコープ)と言います。適用範囲とは、宣言した変数を使う事のできる範囲です。変数を宣言した場所と宣言方法によって、その変数を使える場所が違ってきます。

デバッグ時の違い

ここは、実際のエラーメッセージを見てください。

標準ジュール
マクロ VBA シートモジュール ブックモジュール


このようなダイアログが表示され、「デバッグ」押下で、
VBAの当該行が黄色反転表示されます。
ブックモジュール
シートモジュール
マクロ VBA シートモジュール ブックモジュール

「デバッグ」がなく、当該VBA行が不明です。

上記の動作違いの原因
このような動作違いは、ツールのオプションの設定に依存して起きています。

マクロ VBA シートモジュール ブックモジュール

このエラートラップの指定に依存しています。
初期値の
「エラー処理対象外のエラーで中断」
この状態の時に、上で書いたような違いが発生します。
「クラスモジュールで中断」または「エラー発生時に中断」にしてあれば、
上のエラー時のメッセージはどちらも同じになります。

ブック/シートモジュールを使う場合は、「クラスモジュールで中断」にしておいたほうが良いでしょう。

標準モジュールとシートモジュールの使い分け方

標準モジュールは名前の通りですと、標準的に使うモジュールということになりますが、
そもそも標準と言う言葉があまりにも曖昧に感じられて混乱しやすいのだと思います。

シートやブックはオブジェクトと呼ばれます。
そのオブジェクトに付帯しているモジュールなので、オブジェクトモジュールという言い方もします。

オブジェクトモジュール(ブックモジュール/シートモジュール)
・オブジェクトと切り離すことのできない処理
・一緒にしておいた方が良い処理
オブジェクトモジュールには、これらの処理を記述します。
代表的なものが、イベントプロシージャーになります。
イベントプロシージャーは、当該オブジェクトのモジュールに書かなければならず、オブジェクトと切り離すことのできない処理になります。

単にシートに「依存する処理」という考え方をしてしまうと、
多くの処理がシートに依存していることになり、やたらとシートモジュールに書くことになってしまいます。
そもそも、ほとんどはブックに依存しているので、全てブックモジュールに書くことになってしまいますよね。
つまり、
オブジェクトと一体としてそこに無ければならない処理なのかが判断基準になってくるでしょう。
簡単に考えるなら、シートをコピーした時を想定してみると良いでしょう。
シートをコピーすれば、シートモジュールもコピーされます。
例えば、イベント処理として、

Sheet1
Private Sub Worksheet_Change(ByVal Target As Range)
  '・・・
  'いろいろな処理
  '・・・
End Sub

このSheet1をコピーしてSheet2を作成した時、このシートモジュールも全てコピーされます。
上記のイベント処理も当然コピーされますが、それはむしろ都合が良いでしょう。
しかし、
「いろいろな処理」この記述も含めてそれぞれのシートに存在することになります。
この「いろいろな処理」が数十行のVBAで書かれていたとしたらどうでしょうか。
いったんは問題ないでしょうが、何かの変更が発生したら、、、
ではどうしたら良いか。
「いろいろな処理」の部分は標準モジュールに記載して、
イベントプロシージャーからはCallするような作りにしておくことを考えるべくでしょう。
(当然Tagetを直接または加工して引数として渡すことになります。)

イベント処理以外でもシートモジュールを使用することはあるでしょう。
この時にも、シートのコピーは常に念頭に置いて考えるべきです。
もちろん、
シートをコピーすることが無いといった場合や、
それぞれのシートにVBAが存在している事の是非については、
個別の判断が必要になることは言うまでもありません。

標準モジュール
・オブジェクトとは切り離しておいた方が良い処理
・複数オブジェクトから汎用的に使用される処理
上記以外でも、オブジェクトモジュールに記載する処理以外は全てここに書きます。

ここは見解がいろいろありそうですが、
イベント処理を覚えるまでは、まずは標準モジュールだけ使う事をお勧めしておきます。

シートモジュールの便利な活用方法はありますが、
それらは、イベント処理くらいまでは習得した後に考えれば良いと思います。



同じテーマ「マクロVBA技術解説」の記事

Rangeオブジェクト.Valueの省略について
ユーザー操作を制限する(Locked,Protect,ScrollArea)
シートに数式を設定する時のセル参照の指定方法
標準モジュールとシートモジュールの違い
オートフィルタ(AutoFilter)の使い方まとめ
複雑な条件(複数除外等)のオートフィルター(AutoFilter)
クリップボードを使わないセルのCopy
Rangeの使い方:最終行まで選択を例に
フルパスをディレクトリ、ファイル名、拡張子に分ける
Colorプロパティの設定値一覧
VBAを定型文で覚えよう


新着記事NEW ・・・新着記事一覧を見る

VBAにおける変数のメモリアドレスについて|VBA技術解説(11月8日)
空文字列の扱い方と処理速度について(""とvbNullString)|VBA技術解説(1月7日)
Errオブジェクトとユーザー定義エラー|VBA入門(11月5日)
シングルクォートの削除とコピー(PrefixCharacter)|VBA技術解説(11月4日)
ユーザー定義型の制限とクラスとの使い分け|VBA技術解説(11月3日)
クリップボードに2次元配列を作成してシートに貼り付ける|VBA技術解説(11月1日)
VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)|VBA技術解説(10月31日)
VBAクラスのAttributeについて(既定メンバーとFor Each)|VBA技術解説(10月19日)
VBAの用語について:ステートメントとは|VBA技術解説(10月16日)
VBAのマルチステートメント(複数のステートメントを同じ行に)|VBA技術解説(10月14日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • 標準モジュールとシートモジュールの違い

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。




    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ