通常、変数は スコープ内にあるか、宣言するリージョン全体で参照可能です。 場合によっては、変数の アクセス レベル がそのスコープに影響を与える可能性があります。
詳細については、「 Visual Basic のスコープ」を参照してください。
ブロック レベルまたはプロシージャ レベルでのスコープ
ブロック内でのみ変数を表示するには
変数の Dim ステートメントを、そのブロックの開始宣言ステートメントと終了宣言ステートメントの間 (たとえば、
For
ループのFor
ステートメントとNext
ステートメントの間) に配置します。変数は、ブロック内からのみ参照できます。
プロシージャ内でのみ変数を表示するには
変数の
Dim
ステートメントをプロシージャ内に配置しますが、任意のブロック (With
...End With
ブロックなど) の外側に配置します。変数を参照できるのは、プロシージャ内から (プロシージャに含まれる任意のブロック内を含む) からのみです。
モジュールレベルまたは名前空間レベルでのスコープ
便宜上、単一用語 モジュール レベル は、モジュール、クラス、および構造体に等しく適用されます。 モジュール レベル変数のアクセス レベルによって、そのスコープが決まります。 モジュール、クラス、または構造体を含む名前空間もスコープに影響します。
モジュール、クラス、または構造体全体で変数を表示するには
変数の
Dim
ステートメントは、モジュール、クラス、または構造体内に配置しますが、プロシージャの外側に配置します。Dim
ステートメントに Private キーワードを含めます。変数は、モジュール、クラス、または構造体内のどこからでも参照できますが、外部からは参照できません。
名前空間全体で変数を表示するには
変数の
Dim
ステートメントは、モジュール、クラス、または構造体内に配置しますが、プロシージャの外側に配置します。モジュール、クラス、または構造体を含む名前空間内の任意の場所から変数を参照できます。
例
次の例では、モジュール レベルで変数を宣言し、その可視性をモジュール内のコードに制限します。
Module demonstrateScope
Private strMsg As String
Sub initializePrivateVariable()
strMsg = "This variable cannot be used outside this module."
End Sub
Sub usePrivateVariable()
MsgBox(strMsg)
End Sub
End Module
前の例では、モジュール demonstrateScope
で定義されているすべてのプロシージャで、 String
変数 strMsg
を参照できます。
usePrivateVariable
プロシージャが呼び出されると、ダイアログ ボックスにstrMsg
文字列変数の内容が表示されます。
前の例に対する次の変更により、 strMsg
文字列変数は、その宣言の名前空間内の任意の場所のコードで参照できます。
Public strMsg As String
堅牢なプログラミング
変数のスコープが狭いほど、同じ名前の別の変数の代わりに誤って参照する機会が少なくなります。 参照照合の問題を最小限に抑えることもできます。
.NET Framework のセキュリティ
変数のスコープが狭いほど、悪意のあるコードで不適切な使用を行う可能性が小さくなります。
こちらも参照ください
.NET