変数の適用範囲(スコープ)とエキスパート試験のポイント

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つ選択しなさい。

  1. ローカル変数はDimもしくはPrivateステートメントを使って宣言する。
  2. 1つのプロシージャ内で、同じ名前のローカル変数を宣言することはできない。
  3. モジュール変数は、すべてのモジュールのすべてのプロシージャで使用することができる。
  4. モジュール変数は、プロシージャ内では宣言できない。

正解を見る

2, 4

コメント