変数のスコープとはその変数が有効な範囲のことです。変数の宣言場所や宣言方法によりこのスコープが変わってきます。
スコープの分類
標準モジュールに記述された変数はそのスコープに応じては以下の3つに分類できます。
- プロシージャレベル変数
⇒ プロシージャ内でのみ使用可能な変数 - プライベートモジュールレベル変数
⇒ 同一モジュール内のプロシージャから使用可能な変数 - パブリックモジュールレベル変数
⇒ 同一プロジェクト内のすべてのプロシージャから使用可能な変数
プロシージャレベル変数
プロシージャ内でDimステートメントを使用して宣言した変数をプロシージャレベル変数といいます。
この変数は宣言されたプロシージャ内でのみ有効となります。
プロシージャレベル変数はプロシージャが実行されるたびに自動的に初期化され、プロシージャが終了すると値は破棄されます。 変数の初期化時には、数値変数は 0 に、可変長文字列は長さ 0 の文字列 (“”) に初期化され、 バリアント型 (Variant) 変数は、Empty 値に初期化されます。
Static変数
プロシージャ内ではStaticステートメントを使用して、Static変数を宣言することができます。
Static変数はプロシージャ終了後も値が保持されます。
プライベートモジュールレベル変数
プロシージャ外でDim または Private により宣言した変数をプライベートモジュールレベル変数と言いいます。この変数は同一モジュール内の複数のプロシージャから使用することができます。
モジュールレベル変数はモジュールが読み込まれた初回にだけ初期化されます。マクロが実行終了してもモジュールがリセット(変更されるなど)されない限り値が残っていますので注意してください。
サンプルマクロ
以下のマクロはプライベートモジュールレベル変数”Count”が初期化されていないことを確認するテストです。エクセルを再起動するとまた1からカウントされます。
マクロ”sample3_M1″を初めて実行したとき
上記につづけてマクロ”sample3_M1″を実行したとき
パブリックモジュールレベル変数
モジュールレベルでは Public を使用してパブリックモジュールレベル変数を宣言することができます。パブリックモジュールレベル変数はプロジェクト内のすべてのプロシージャから使用可能です。