変数のスコープ(適用範囲)

変数のスコープとはその変数が有効な範囲のことです。変数の宣言場所や宣言方法によりこのスコープが変わってきます。

スポンサーリンク

スコープの分類

標準モジュールに記述された変数はそのスコープに応じては以下の3つに分類できます。

  • プロシージャレベル変数
    ⇒ プロシージャ内でのみ使用可能な変数

  • プライベートモジュールレベル変数
    ⇒ 同一モジュール内のプロシージャから使用可能な変数

  • パブリックモジュールレベル変数
    ⇒ 同一プロジェクト内のすべてのプロシージャから使用可能な変数

プロシージャレベル変数

プロシージャ内でDimステートメントを使用して宣言した変数をプロシージャレベル変数といいます。
この変数は宣言されたプロシージャ内でのみ有効となります。

プロシージャレベル変数はプロシージャが実行されるたびに自動的に初期化され、プロシージャが終了すると値は破棄されます。 変数の初期化時には、数値変数は 0 に、可変長文字列は長さ 0 の文字列 (“”) に初期化され、 バリアント型 (Variant) 変数は、Empty 値に初期化されます。

プロシージャレベル変数
プロシージャレベル変数

Static変数

プロシージャ内ではStaticステートメントを使用して、Static変数を宣言することができます。
Static変数はプロシージャ終了後も値が保持されます。

構文
Static [変数名] as [データ型]

プライベートモジュールレベル変数

プロシージャ外でDim または Private により宣言した変数をプライベートモジュールレベル変数と言いいます。この変数は同一モジュール内の複数のプロシージャから使用することができます。

構文
※プロシージャの外であること
Dim [変数名] as [データ型]
Private [変数名] as [データ型]

モジュールレベル変数はモジュールが読み込まれた初回にだけ初期化されます。マクロが実行終了してもモジュールがリセット(変更されるなど)されない限り値が残っていますので注意してください。

標準モジュール以外のオブジェクトモジュール(シートやブック、ユーザーフォームなど)に記述したモジュールレベル変数(パブリック含む)はすべてプライベート扱いになります。

サンプルマクロ

以下のマクロはプライベートモジュールレベル変数”Count”が初期化されていないことを確認するテストです。エクセルを再起動するとまた1からカウントされます。

プライベートモジュールレベル変数
プライベートモジュールレベル変数

マクロ”sample3_M1″を初めて実行したとき

初回実行時
初回実行時

上記につづけてマクロ”sample3_M1″を実行したとき

2回目実行時
2回目実行時

パブリックモジュールレベル変数

モジュールレベルでは Public を使用してパブリックモジュールレベル変数を宣言することができます。パブリックモジュールレベル変数はプロジェクト内のすべてのプロシージャから使用可能です。

構文
※プロシージャの外であること
Public [変数名] as [データ型]
タイトルとURLをコピーしました