Visual Basic for Applications の変数の適用範囲


概要


変数の適用範囲は、変数が宣言されるときに決まります。 Microsoft Visual Basic for Applications の変数の適用範囲には、プロシージャ、モジュール、およびパブリックの 3 種類があります。 この記事の「詳細」では、各適用範囲の詳細について説明します。

詳細情報


プロシージャ (ローカル) レベル変数の適用範囲

プロシージャ レベルの適用範囲が定義されたローカル変数は、その変数が宣言されたプロシージャ内のみで認識されます。 ローカル変数は、Dim ステートメントまたは Static ステートメントで宣言できます。
Dim
Dim ステートメントで宣言されたローカル変数は、その変数が宣言されたプロシージャの実行中のみ存在します。 通常は、プロシージャの実行が終了すると、そのプロシージャのローカル変数の値は保存されず、それらの変数に割り当てられていたメモリは解放されます。 プロシージャのすべてのローカル変数は、次回そのプロシージャが実行されるときに再初期化されます。


たとえば、以下のサンプル マクロ "Example1" と "Example2" では、変数 X が各モジュール内で宣言されています。 それぞれの変数 X は他のモジュール内の変数 X には依存しません。各変数は、その変数が宣言されたプロシージャ内のみで認識されます。
   Sub Example1()
Dim X As Integer
' Local variable, not the same as X in Example2.
X = 100
MsgBox "The value of X is " & X
End Sub
   Sub Example2()
Dim X As String
' Local variable, not the same as X in Example1.
X = "Yes"
MsgBox "The answer is " &X
End Sub
Static:


Static ステートメントで宣言されたローカル変数は、Visual Basic の実行中のみ存在します。 次のいずれかが発生した場合、変数はリセットされます。

  • トラップされないランタイム エラーがマクロにより生成された場合
  • Visual Basic が停止した場合
  • Microsoft Excel を終了した場合
  • モジュールを変更した場合
たとえば、以下の RunningTotal サンプルの場合、Accumulate 変数の値はリセットされず、モジュールが実行されるたびに増加します。 このモジュールを最初に実行したとき、2 という数値を入力すると、メッセージ ボックスには値 "2" が表示されます。 次回モジュールを実行したとき、3 という数値を入力すると、メッセージ ボックスには現在の合計として "5" が表示されます。
   Sub RunningTotal()
Static Accumulate
' Local variable that will retain its value after the module
' has finished executing.
num = Application.InputBox(prompt:="Enter a number: ", Type:=1)
Accumulate = Accumulate + num
MsgBox "The running total is " & Accumulate
End Sub

モジュール レベル変数の適用範囲

モジュール シート上のすべてのプロシージャで認識される変数は、"モジュール レベル" 変数と呼ばれます。 モジュール レベル変数はモジュール内のすべてのプロシージャで使用できますが、他のモジュールに含まれるプロシージャでは使用できません。 モジュール レベル変数は、Visual Basic の実行中、その変数が宣言されたモジュールが編集されるまで存在します。 この変数は、モジュールの冒頭の、最初のプロシージャ定義より上の部分で、Dim ステートメントまたは Private ステートメントを使用して宣言できます。


モジュール レベルでは、Dim ステートメントと Private ステートメントは同等です。 モジュール レベル変数はプロシージャ内では宣言できません。


注: Dim ステートメントの代わりに Private ステートメントを使用してモジュール レベル変数を宣言すると、コードが読みやすくなります。つまり、ローカル変数は Dim ステートメントで宣言し、モジュール レベル変数は Private ステートメントで宣言することにより、個々の変数の適用範囲がわかりやすくなります。


以下の例では、モジュール レベルで 2 つの変数 A と B が宣言されています。 これら 2 つの変数はモジュール シートに含まれるすべてのプロシージャで使用できます。 Example3 マクロで宣言されている 3 番目の変数 C はローカル変数であるため、このプロシージャのみで使用できます。


Example4 では、マクロによって変数 C の使用が試みられても、メッセージ ボックスに値は表示されません。 これは、Example4 では変数 A と B は使用できますが、ローカル変数である変数 C は使用できないためです。
   Dim A As Integer        ' Module-level variable.
Private B As Integer ' Module-level variable.

Sub Example1()
A = 100
B = A + 1
End Sub

Sub Example2()
MsgBox "The value of A is " & A
MsgBox "The value of B is " & B
End Sub

Sub Example3()
Dim C As Integer ' Local variable.
C = A + B
MsgBox "The value of C is " & C
End Sub

Sub Example4()
MsgBox A
' The message box displays the value of A.
MsgBox B
' The message box displays the value of B.
MsgBox C
' The message box displays nothing because C was a local variable.
End Sub

パブリック変数の適用範囲

パブリック変数は、すべての変数の中で最も適用範囲が広い変数です。 この変数は、アクティブなブックに含まれるすべてのモジュールで認識されます。 パブリック変数を他のブックでも使用できるようにするには、新しいブックの [参照設定] ダイアログ ボックスで、[参照可能なライブラリ ファイル] ボックスの一覧にある、パブリック変数が含まれたブックに対応するチェック ボックスをオンにします ([参照設定] ダイアログ ボックスを表示するには、モジュール シートで、[ツール] メニューの [参照設定] をクリックします)。

パブリック変数はモジュール レベル変数と同様に、モジュールの冒頭の、最初のプロシージャ定義より上の部分で宣言します。 パブリック変数は、プロシージャ内で宣言することはできません。 パブリック変数の宣言に使用できるステートメントは Public のみです。 パブリック変数は、どのモジュール シートでも宣言できます。


複数のモジュール シートで同じ名前のパブリック変数を宣言することもできます。 変数名が紛らわしくなり、エラーの原因となることがあります。これを避けるために、一意の名前を使用するか、各変数名の先頭にモジュール修飾子を付けることをお勧めします (たとえば、モジュール名が "Feb_Sales" の場合、すべてのパブリック変数の先頭に "FS" という文字を付けます)。


マクロを作成するには、以下の手順を実行します。
  1. 新しいブックを作成して CDSales.xls という名前を付けます。

    注: Excel 2007 では、ファイルを Excel マクロ有効ブックとして保存してください (この例ではファイル名は CDSales.xlsm になります)。
  2. CDSales ブックにモジュール シートを挿入します。 CDSales という名前を付けます。

    Microsoft Excel 97 以降では、以下の手順で新しいモジュール シートの挿入と名前付けを行います。
    1. CDSales ブックで、Alt キーを押しながら F11 キーを押して Visual Basic Editor を開きます。
    2. [挿入] メニューの [標準モジュール] をクリックします。
    3. Microsoft Excel for Windows (Version 97 以降) では、モジュールをアクティブにすることによってモジュール名を変更できます。これを行うには、Visual Basic Editor の [プロパティ] ウィンドウで [(オブジェクト名)] の右側をクリックして新しいモジュール名を入力し、Enter キーを押します。
  3. CDSales モジュール シートに、次のコードを入力します。
          Public SalesPrice As Integer
    Public UnitsSold As Integer
    Public CostPerUnit As Integer
    Private Markup As Long

    Sub CDSales()
    Dim X as String
    SalesPrice = 12
    UnitsSold = 1000
    CostPerUnit = 5
    Markup = 1.05
    X = "yes"
    MsgBox "The Gross Profit for CD Sales is $" & (SalesPrice _
    * UnitsSold) -(UnitsSold * CostPerUnit * Markup)
    ' Displays the value of 7000 as the gross profit.
    End Sub
  4. 新しいブックを作成し VideoSales.xls という名前を付けます。

    注: Excel 2007 では、Excel マクロ有効ブックとしてファイルを保存してください (この例ではファイル名は VideoSales.xlsm になります)。
  5. VideoSales ブックにモジュール シートを挿入し、 VideoSales という名前を付けます。

    Microsoft Excel 97 以降では、以下の手順で新しいモジュール シートの挿入と名前付けを行います。
    1. CDSales ブックで、Alt キーを押しながら F11 キーを押して Visual Basic Editor を開きます。
    2. [挿入] メニューの [標準モジュール] をクリックします。
    3. Microsoft Excel for Windows (Version 97 以降) では、モジュールをアクティブにすることによってモジュール名を変更できます。これを行うには、Visual Basic Editor の [プロパティ] ウィンドウで [(オブジェクト名)] の右側をクリックして新しいモジュール名を入力し、Enter キーを押します。
  6. VideoSales モジュール シートに、次のコードを入力します。
          Public SalesPrice As Integer
    Public UnitsSold As Integer
    Public CostPerUnit As Integer

    Sub VideoSales()
    SalesPrice = CDSales.SalesPrice * 1.05
    UnitsSold = CDSales.UnitsSold * 1.456
    CostPerUnit = CDSales.CostPerUnit * 1.75
    MsgBox "The Projected Gross Profit for video sales is $" & _
    (SalesPrice * UnitsSold) - (UnitsSold * CostPerUnit)
    ' Displays the value of 5824 as the projected gross profit.
    End Sub

Microsoft Excel 97 以降でサンプル マクロを実行する方法

  1. 以下の手順に従って、2 つのブックに含まれる各プロジェクトの名前を変更し、それぞれに一意の名前を付けます。
    1. Visual Basic Editor のプロジェクト エクスプローラで、一覧に表示されているプロジェクトを確認します。 一覧には、次のような項目が表示されています。
      <VBAProject> (VideoSales.xls)
      <VBAProject> (CDSales.xls)
      <VBAProject> (Personal.xls)
      <VBAProject> はプロジェクトの名前です。
    2. CDSales.xls という項目をクリックします。 Excel 2007 の場合は CDSales.xlsm という項目をクリックします。
    3. [プロパティ] ウィンドウの [(オブジェクト名)] の右側にあるボックスに新しい一意のプロジェクト名を入力し、Enter キーを押します。


      注: 他のブックで使用されているプロジェクト名は使用しないでください。
    4. [ファイル] メニューの [<bookname> の上書き保存] (<bookname> はプロジェクト名を変更したブックの名前) をクリックします。
  2. ブック VideoSales からブック CDSales への参照を作成するには、VideoSales の [VideoSales] モジュール シートをクリックし、[ツール] メニューの [参照設定] をクリックします。
  3. [参照設定] ダイアログ ボックスで、手順 1c. で指定したプロジェクト名に対応するチェック ボックスをオンにし、[OK] をクリックします。
  4. CDSales マクロを実行し、次に VideoSales マクロを実行します。
VideoSales マクロでは、CDSales.xls の CDSales モジュールで宣言されているパブリック変数が使用されます。

ローカル変数にアクセスしようとしたときに発生するマクロ エラーの例

次の例では、VideoSales モジュール シートのモジュール レベル変数 CDSales.Markup、またはローカル変数 CDSales.X の使用を試みます。
   Sub VideoSales2()
MsgBox CDSales.Markup
End Sub
Sub VideoSales3()
MsgBox CDSales.X
End Sub
Microsoft Excel 97 以降では、これらのプロシージャのいずれかを実行すると、次のエラー メッセージが表示されます。
コンパイル エラー :
メソッドまたはデータ メンバが見つかりません。

関連情報


適用範囲の詳細については、Microsoft Excel 7.0 ヘルプの [インデックス] タブをクリックして、
適用範囲を入力し、選択されたテキストをダブルクリックして、「適用範囲と参照可能範囲の概要」に移動します。