拙著『いちばんやさしいExcel VBAの教本』の、Lesson 34「Subプロシージャごとに変数宣言することに慣れましょう」では、 モジュールレベル変数について少しだけ触れています。
モジュールレベル変数とプロシージャレベル変数の違いだけを解説するため、プロシージャの外でDimキーワードを使って宣言する形で解説をしていますが、実際にモジュールレベル変数を使う場合には、DimよりもPrivateで宣言するほうが、意味がより明確になってイイでしょう。
そして実は、Privateの対語でもあるPublicというキーワードを使って変数を宣言することも可能です。
この変数宣言の、PrivateとPublicの違いがよくわからないという方が、時折いらっしゃいます。
PrivateとPublicの違い
標準モジュールの変数宣言部で、PrivateとPublicを使った場合の違いを結論からお伝えすると、以下のとおりです。
Privateで宣言された変数は、宣言したモジュールの中でのみ、どこからでも使えます。
これに対し、
Publicで宣言された変数は、プロジェクト全体の中で、どこからでも使えます。
Private変数とPublic変数を用意する
実際にコードを書いて確認しましょう。
PrivateとPublicの違いを確認するには、モジュールを2つ以上用意する必要があります。
今回は、Publicで宣言する変数や、プロジェクト全体で広く使われるプロシージャ等を配置することを想定した標準モジュールの名前を「Common」に、通常のプロシージャ等を配置する標準モジュールはデフォルトのまま「Module1」としてみます。
プロジェクトエクスプローラーは下図のような状態になります。
Commonモジュール
2つのモジュールが準備できたら、Commonモジュールに以下のようにPublicで変数を宣言します。Option Explicit
Public g_cnt As Long
何らかの数をカウントすることを想定した変数g_cntを、Long型で宣言しています。
Publicで宣言したグローバル(global)変数ということを明確にするため、接頭辞g_を付けた、g_cntという名前にしました。
Module1モジュール
つづいてModule1モジュールには、以下のようにPrivateで変数宣言を行い、Subプロシージャも作成しましょう。
Option Explicit
Private m_cnt As Long Sub sample()
m_cnt = m_cnt + 1
g_cnt = g_cnt + 1
End Sub
モジュールレベルで何らかの数をカウントすることを想定した変数m_cntを、やはりLong型で宣言しています。
Privateで宣言したモジュール(module)レベル変数ということを明示するために、接頭辞m_を付けた、m_cntという名前にしました。
Subプロシージャsampleには、変数g_cntとm_cntをインクリメントする処理だけを書いています。
VBAProjectのコンパイルと接頭辞
この状態でメニュー[デバッグ]-[VBAProjectのコンパイル]を実行すれば、エラーが発生することなくコンパイルが行われます。
ちなみに、接頭辞をg_とm_にしていますが、これはどの範囲で有効な変数なのかを判別しやすくするため便宜的につけただけで、必ずこうしなければならないというわけではありません。
実務でどうするのかは、コーディング規約で決めましょう。
変数のPrivateとPublicを確認する
ここまでは変数のPrivateとPublicの違いを確認するための、いわば準備作業です。
実際の違いを体験しましょう。Commonモジュールに以下のSubプロシージャを追加して、[VBAProjectのコンパイル]を実行してみてください。
m_cnt = m_cnt + 1
g_cnt = g_cnt + 1
End Sub
先ほど、Commonモジュールに作成したsampleプロシージャと同じ処理が書かれているだけですが、変数m_cntが反転した「変数が定義されていません。」コンパイルエラーが発生します。
Module1内でPrivateキーワードを使って宣言された変数m_cntは、Commonモジュールからは、見えていない状態になっているということです。
変数m_cntは、Module1内でならどこでも使えますが、他のモジュールでは使えないわけです。
これに対し、Module1モジュールに作成したSubプロシージャsampleでは、Privateで宣言された同じモジュール内にあるm_cntだけでなく、別のモジュールであるCommonモジュールでPublicキーワードを使って宣言したg_cntも見えているわけです。
これが、PrivateとPublicの違いです。
PrivateとPublicの違い
Privateで宣言された変数は、宣言したモジュールの中でのみ、どこからでも使えます。
Publicで宣言された変数は、プロジェクト全体の中で、どこからでも使えます。
最終更新日時:2018-10-25 03:14
Home » エクセルマクロ・Excel VBAの使い方 » 変数のPrivateとPublicの違い