方法: 変数のスコープを制御する (Visual Basic)

通常、変数が宣言された領域内全体がその変数のスコープとなります。つまり、その範囲から変数を参照できます。場合によっては、変数のアクセス レベルがスコープに影響を及ぼします。

詳細については、「Visual Basic におけるスコープ」を参照してください。

ブロックまたはプロシージャ レベルのスコープ

変数をブロック内でのみ参照できるようにするには

  • 変数の Dim ステートメント (Visual Basic) を、そのブロックの開始ステートメントと終了ステートメントの間に置きます。たとえば、For ループの For ステートメントと Next ステートメントの間です。

    これにより、ブロック内でのみ変数が参照できます。

変数をプロシージャ内でのみ参照できるようにするには

  • 変数の Dim ステートメントを、プロシージャの内側の、しかも何のブロック内 (With...End With ブロックなど) にも属さない場所に記述します。

    これにより、プロシージャに含まれている各ブロックの内部も含めたプロシージャの内部からのみ変数を参照できます。

モジュールまたは名前空間レベルのスコープ

便宜上、モジュール、クラス、および構造体に対して、モジュール レベル という 1 つの用語を使用します。モジュール レベルの変数のアクセス レベルによってスコープが決まります。また、モジュール、クラス、または構造体を含んでいる名前空間もスコープに影響します。

モジュール、クラス、または構造体全体にわたって変数を参照できるようにするには

  1. 変数の Dim ステートメントを、モジュール、クラス、または構造体の内側の、しかも何のプロシージャ内にも属さない場所に記述します。

  2. Dim ステートメントには Private (Visual Basic) キーワードを含めます。

  3. これにより、モジュール、クラス、または構造体のどこからでも変数を参照できます。外側からは参照できません。

名前空間全体にわたって変数を参照できるようにするには

  1. 変数の Dim ステートメントを、モジュール、クラス、または構造体の内側の、しかも何のプロシージャ内にも属さない場所に記述します。

  2. Dim ステートメントには Friend (Visual Basic) キーワードまたは Public (Visual Basic) キーワードを含めます。

  3. これにより、モジュール、クラス、または構造体を含む名前空間内のどこからでも変数を参照できます。

使用例

次の例では、モジュール レベルで変数を宣言し、モジュール内のコードからのみ参照できるように制限しています。

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

信頼性の高いプログラミング

変数のスコープが狭いほど、同じ名前の別の変数を誤って参照してしまう可能性は少なくなります。また、参照先との一致に関する問題も最小化できます。

セキュリティ

変数のスコープが狭いほど、悪意のあるコードによって変数が不正に使用される可能性が少なくなります。

参照

関連項目

Dim ステートメント (Visual Basic)

概念

Visual Basic におけるスコープ

Visual Basic における有効期間

Visual Basic でのアクセス レベル

Visual Basic における変数

Visual Basic での変数宣言