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変数として宣言する必要があります。


コメント