主な内容の要点
概要
- VBAで変数を定義する際、「どこで宣言したか」によってその変数を参照できる範囲(スコープ、適用範囲)が変わる。
- スコープを理解しておかないと、意図しない変数の重複やアクセスエラーが発生する。
スコープのパターンと具体例
1. プロシージャ(サブルーチン/関数)内で宣言する(ローカル変数)
Dimを使ってプロシージャ内で変数を宣言すると、その変数はそのプロシージャ内だけで使える。- 同じモジュール内の別プロシージャからその変数を参照しようとすると、未定義の変数扱いになりエラーになる。
- 別のプロシージャにも同じ名前の変数を宣言すれば、それぞれ独立した別個の変数になる。
例:
Sub テスト1()
Dim num As Integer
num = 10
End Sub
Sub テスト2()
num = 15 ' エラー:変数 num が定義されていない
End Sub
VBまた、異なるプロシージャで同じ名前 num を使っても、それぞれ別の変数として扱われる。
2. プロシージャの外で宣言する(モジュールレベルの変数)
- モジュールの先頭部分(プロシージャ外)で変数を宣言すると、その変数はそのモジュール内のすべてのプロシージャから参照できる。
- 複数のプロシージャで共通して使いたいデータを持たせたい場合、この方法が使われる。
- ただし、プロシージャ内で同じ名前でローカル変数を再宣言すると、ローカル変数が優先され、モジュールレベル変数とは別扱いになる。
例:
Dim num As Integer ' モジュールレベルで宣言
Sub テスト1()
num = 10
End Sub
Sub テスト2()
num = num + 5
End Sub
VBこの場合、テスト1 → テスト2 の順で実行すると、num = 15 になる。
さらに、プロシージャ内で同名のローカル変数を宣言すると、モジュールレベル変数とは別の変数として扱われる。
注意点/補足
Option Explicitを使っている場合、すべての変数は明示的に宣言する必要がある。宣言していない変数の使用はコンパイル時にエラーになる。- モジュールレベル変数の利便性とリスク:便利だが、意図せず他プロシージャ間で状態が共有され、バグの原因になることもある。
- 変数名の衝突回避のためには、モジュールの分割や命名規則の徹底が有効。

