下記の変数や定数のスコープ(有効範囲)と使い方についてご紹介していきます。
- Public
- Static
- Dim
- Const
変数(定数)スコープとは
変数(定数)は宣言をすればどこからでも呼び出して利用できるわけではありません。宣言の記述方法や変数を宣言した場所によって利用範囲が決定します。
下記の例ではSubプロシージャtest1で宣言された変数xを別のSubプロシージャであるtest2で新しく文字列を格納しなおして呼び出しています。
ですが、test1のSubプロシージャ内で宣言された変数xはtest2で呼び出そうとすると宣言されていない変数を使おうとしたとしてエラーが発生してしまいます。
Sub test1()
Dim x As String
x = "hello"
MsgBox x
End Sub
Sub test2()
x = "dog!"
MsgBox x
End Sub
白・・・コード
紫・・・コメント
青・・・プロシージャの宣言
その他・・・コードを見やすくするために使うかも
これは宣言された変数xのスコープ(有効範囲)がSubプロシージャtest1の範囲内となっているからです。
宣言セクションについて
VBAには宣言セクションと呼ばれる記述スペースがあります。これはマクロを記述するVBEの画面最上部(先頭にあるプロシージャの上の部分)のスペースのことです。
この後に解説する変数のスコープ範囲を記述していくうえで必要な知識となりますので覚えておきましょう
また、VBEの初期設定ではOption Explicitと記載されていますが、これは変数の宣言を強制するという意味になります。
変数宣言の強制は設定を変更することで解除することができ、宣言を利用しないで変数を使うことができるようになります。
ですが、変数の宣言は有効範囲を明確にして用途(データ型など)をはっきりさせるという重要な役割があります。
ツール作成をする際には変数の範囲や用途が明確でないと後からツールを改修したいと思った時にバグが発生しやすくなります。
また、プロジェクトなどで管理されているツールでは複数の人が利用、改修する為よりリスクは高くなります。
そのため、変数の宣言は特別な理由がない限りは必ず利用するようにしましょう
宣言の種類とスコープ(有効範囲)
変数や定数を宣言する際の方法と有効範囲について紹介していきます。
『Dim』プロシージャ内のみで利用できる
宣言したプロシージャ内のみで利用することができます。実はプロシージャの外でDimによる変数宣言すると同一モジュールのすべてのプロシージャで利用できる(後述するPrivateと同じ扱い)ようになりますが、詳細については割愛します。
下記の例ではSubプロシージャtest1で変数xを宣言しているため、Subプロシージャtest2では変数xを利用することができません。
変数xを利用することができるのは変数の宣言をしたSubプロシージャtest1の中のみとなります。
Sub test1()
Dim x As String
x = "柴犬"
MsgBox x
End Sub
Sub test2()
x = "シーズー"
MsgBox x
End Sub
『Private』同一モジュール内のプロシージャで利用できる
宣言をしたモジュール内であればどのプロシージャでも利用できる宣言方法です。プロシージャの外で変数を宣言する必要があります。
例では同一モジュールのSubプロシージャtest1,test2(どちらもModule1)のどちらでも変数xを利用することができますが、Subプロシージャtest3(Module2)ではモジュールが異なるため利用できません。
Option Explicit
Private x As String
Sub test1()
x = "柴犬"
MsgBox x
End Sub
Sub test2()
x = "ダックスフンド"
MsgBox x
End Sub
定数は下記の通り
Option Explicit
Private Const x As String ="柴犬"
Sub test()
Debug.Print x
End Sub
『Public』すべてのモジュールで利用できる
すべてのモジュールで汎用的に利用したい場合はPublicで宣言します。注意点としてはDimとは異なりプロシージャ内で宣言するのではなく下記のように宣言セクションに記述して利用します。
また、Publicで宣言された変数を『パブリック変数』と呼びます。
Option Explicit
Public x As String
Sub test1()
x = "柴犬"
MsgBox x
End Sub
Sub test2()
x = "ダックスフンド"
MsgBox x
End Sub
上記のコードではどちらも変数xを利用することができ、Subプロシージャtest1では文字列”柴犬”をメッセージボックスで出力し、Subプロシージャtest2では変数xに文字列”ダックスフンド”を格納してメッセージを出力しています。
このようにDimの宣言では1つのプロシージャ内でのみの有効範囲だった変数xが、別のプロシージャ内でも利用できるようになりました。
定数の場合は以下になります。
Option Explicit
Public Const x As String ="柴犬"
Sub test()
Debug.Print x
End Sub
変数とは異なりConstの前にPublicを記述します。定数の値は宣言時に格納するので、他のモジュールやプロシージャでの代入は必要ありません。
定数名を指定して出力をすればそのまま表示させることができます。