VBAで関数内から外部変数にアクセスできない理由と0が返る仕組み

Visual Basic

VBAでプロシージャと関数を同じモジュールに作成した場合、関数内でプロシージャの変数にアクセスできないことがあります。この動作を理解すると、なぜF_Proc関数が0を返すのかがわかります。本記事では、スコープと変数の有効範囲について解説します。

プロシージャと関数の変数スコープ

SubやFunction内で宣言された変数は、そのプロシージャや関数内でのみ有効です。この範囲をローカルスコープと呼びます。

例: Sub M_Proc() 内で Dim A As Long と宣言したAは、M_Proc内でしかアクセスできず、F_Procからは見えません。

関数が返す値と未初期化変数

F_Proc関数内で A * X * 2 を返そうとしていますが、Aは関数内で宣言されていないため、初期値0として扱われます。その結果、計算結果は 0 * 3 * 2 = 0 となり、MsgBox B は 0 を表示します。

正しい値を返す方法

外部の変数Aの値を関数で使いたい場合、以下の方法があります:

  • 関数にAを引数として渡す: F_Proc(A, 3)
  • モジュールレベルでPublic変数として宣言する: Public A As Long

これにより、関数内で正しい値を参照できます。

まとめ

VBAでは、プロシージャ内で宣言したローカル変数は他の関数から参照できません。今回の例では、F_Proc内でAが未定義のため0が使われ、計算結果も0となります。外部変数を関数で使用したい場合は、引数として渡すか、Public変数として宣言する必要があります。

コメント

タイトルとURLをコピーしました