VBAの変数には、使用できる範囲が決められている。その範囲のことを適用範囲(スコープ)という。
適用範囲の種類
VBAの変数には次の3つの適用範囲がある。それぞれの変数の特徴を表にした。VBAエキスパート試験を受ける上で、これらの違いを押さえておくことは重要と思う。
変数の種類 | ステートメント | 適用範囲 |
---|---|---|
ローカル変数 | Dim | 宣言されたプロシージャ内でのみ使用できる |
モジュール変数 | DimまたはPrivate | 宣言されたモジュール内のすべてのプロシージャで使用できる |
パブリック変数 | Public | すべてのモジュールのすべてのプロシージャで使用できる |
以下、それぞれの適用範囲について述べていく。
ローカル変数
ローカル変数は、宣言されたプロシージャ内でのみ使用できる。Dimステートメントを使って宣言する。
次のプロシージャ「Test1」内では、変数numberが宣言されている。この変数はローカル変数だ。
Sub Test1()
'ローカル変数
Dim number As Long
number = 1000
MsgBox number * 2
End Sub
では、次のコードの場合はどうなるだろうか。プロシージャ「Test1」のほかに、プロシージャ「Test2」を追加した。
Sub Test1()
'ローカル変数
Dim number As Long
number = 1000
MsgBox number * 2
End Sub
Sub Test2()
number = 2000
MsgBox number * 3
End Sub
プロシージャ「Test2」を実行すると、コンパイルエラーが発生する。なぜなら、変数numberはプロシージャ「Test1」で宣言されたローカル変数だからだ。プロシージャ「Test2」のほうでは使用できない。
モジュール変数
モジュール変数は、宣言したモジュールの中であればどこでも使うことができる。DimもしくはPrivateステートメントを使って宣言する。
次のコードでは変数numberが宣言されている。この変数はモジュール変数だ。プロシージャ「Test1」「Test2」は、どちらも正常に実行することができる。
Option Explicit
'モジュール変数
Private number As Long
Sub Test1()
number = 1000
MsgBox number * 2
End Sub
Sub Test2()
number = 2000
MsgBox number * 3
End Sub
パブリック変数
パブリック変数は、宣言したモジュール以外でも使うことができる。言い方を変えると、どこでも使用できる変数だ。Publicステートメントを使って宣言する。
次のコードでは変数numberが宣言されている。この変数はPublic変数だ。プロシージャ「Test1」「Test2」は、どちらも正常に実行することができる。
Option Explicit
'パブリック変数
Public number As Long
Sub Test1()
number = 1000
MsgBox number * 2
End Sub
Sub Test2()
number = 2000
MsgBox number * 3
End Sub
しかし、この例だけだとモジュール変数との違いがよく分からないと思う。
そこで、以下のコードを考えてみる。
モジュール変数とパブリック変数の違い
まず、次のコードを標準モジュール「Module1」に記述する。
さらに、別の標準モジュール「Module2」に次のコードを記述する。
標準モジュール「Module2」にはプロシージャ「Test3」が定義されている。このプロシージャは正常に実行することができるだろうか?
答えは「できる」だ。
プロシージャ「Test3」で使っているNumberという変数がポイントだ。この変数は、モジュール「Module2」の中では定義されていない。定義されているのはモジュール「Module1」の中だ。
しかし、パブリック変数であるため、モジュール間をまたがって使用することができる。モジュール変数の違いとパブリック変数の違いはこの点にある。
その他のポイント
VBAエキスパート試験対策としては、次の内容も重要だ。
- For...Nextループで使うカウンタにはローカル変数を使うこと。
- モジュール変数はDimとprivate どちらで宣言してもよい。
- モジュール変数はプロシージャの中で宣言できない。宣言できるのはモジュールの宣言セクション。
- パブリック変数もプロシージャの中で宣言できない。宣言できるのはモジュールの宣言セクション。
練習問題
次の文章のうち内容が正しいものを2つ選択しなさい。
- ローカル変数はDimもしくはPrivateステートメントを使って宣言する。
- 1つのプロシージャ内で、同じ名前のローカル変数を宣言することはできない。
- モジュール変数は、すべてのモジュールのすべてのプロシージャで使用することができる。
- モジュール変数は、プロシージャ内では宣言できない。
正解を見る
コメント