Visual Basic for Applicationsの Excel サブプロシージャで変数を使用する方法

概要

この記事では、Microsoft Visual Basic for Applicationsの Microsoft Excel サブプロシージャで変数を使用する方法について説明します。

追加情報

サブプロシージャ内の変数

プログラミング言語の強力な機能は、変数の内容を使用したり、プロシージャの後半で変更したりできるように、変数に何かを格納する機能です。 このドキュメントでは、Visual Basic での変数の次の使用について説明します。

  • 変数の宣言方法。
  • 変数を使用できるプロシージャとプロジェクト。
  • 変数の有効期間。

マクロで変数を宣言する

マクロで変数を宣言する最も簡単な方法は、Dim ステートメントを使用することです。 次の行では、2 つの変数を整数として宣言します。

    Dim x As Integer, y As Integer

x と y を整数として指定すると、整数変数に対して十分なメモリを確保するように Visual Basic に指示します (x と y は 2 バイトずつ)、x または y に格納される情報は -32768 から 32767 までの整数です。

メモ: 1 つの Dim ステートメントを使用して複数の変数を宣言する場合は、各変数のデータ型を指定する必要があります。

次の Visual Basic コードのように、各変数のデータ型を指定しない場合、変数 y のみが整数変数として設定されます。 変数 x はバリアント型になります。

    Dim x, y As Integer

詳細については、以下の 「バリアント 型」を 参照してください。
 

変数テストを実行するには、次の手順に従います。

  1. 開いているブックを保存して閉じ、新しいブックを開きます。

  2. Visual Basic エディターを起動します (Alt キーを押しながら F11 キーを押します)。

  3. [挿入] メニューの [モジュール] をクリックします。

  4. 次のコードを入力します。

    Sub Variable_Test()
        Dim x As Integer、y As Integer
        x = 10
        y = 100
        MsgBox "x の値は " & x & _
        Chr(13) & "y の値は " & y
    End Sub

  5. Variable_Test マクロを実行します。 次のメッセージが表示されます。

    the value of x is 10
    the value of y is 100

  6. [OK] をクリックします。

  7. Variable_Test マクロで、次の行を変更します。

    x = 10

  8. 次のように変更します。

    x = "error"

  9. Variable_Test マクロを実行します。

"error" は整数ではなく、この文字列値を整数変数 x に割り当てようとしているため、実行時エラーが発生します。
 

データ型の概要

一般的な変数データ型は次のとおりです。

共通変数データ型

バリアント データ型

変数を宣言するときにデータ型を指定しない場合、または変数をまったく宣言しない場合、Visual Basic では、この変数のバリアント データ型が自動的に指定されます。 このデータ型として宣言される変数の利点を次に示します。

  • 変数には、文字列、日付、時刻、ブール値、または数値を含めることができます。
  • 変数は、含まれる値を自動的に変換できます。

欠点は、バリアント変数には少なくとも 16 バイトのメモリが必要です。 16 バイトのメモリは、大規模なプロシージャや複雑なモジュールで重要な場合があります。

Variable_Test マクロでこれがどのように機能するかを確認するには、次の手順に従います。

Variable_Test マクロのコードを次に変更します。


Sub Variable_Test()
    Dim x, y
    x = "string"
    y = 1.23
    MsgBox "the value of x is " & x & _
    Chr(13) & "the value of y is " & y
End Sub

Variable_Test マクロを実行します。

バリアント変数 x と y に何かを割り当てることができるため、エラーは発生しません。

メモ: 次の行を除外することもできます。変数 x と y は Variant データ型として扱われるので、マクロは引き続き機能します。

    Dim x, y

変数のスコープ

変数を宣言すると、同じモジュール内、他のモジュール、または他のプロジェクト内の他のマクロに表示される場合と、表示されない場合があります。 モジュール内の変数のこの可用性は、スコープと呼ばれます。 スコープの 3 種類は、プロシージャ レベル、プライベート モジュール レベル、パブリック モジュール レベルです。 スコープは、変数または変数を宣言する方法と場所によって異なります。

プロシージャ レベルのスコープ

プロシージャ レベルのスコープを持つ変数は、宣言されているプロシージャの外部には表示されません。 プロシージャ レベルのスコープを持つ変数の値を設定した場合、その変数の内容は他のマクロには表示されません。

プロシージャ レベルのスコープを持つ変数が宣言されているプロシージャの外部に表示されないことを確認するには、次の手順に従います。

  1. プロジェクトに新しいモジュールを挿入します。

  2. このモジュールに、次のマクロの両方を入力します。
      Sub Macro1() Dim x As Integer x = 10 MsgBox "x, as Macro1 is " & x 'next line runs Macro2 Macro2 End Sub Sub Macro2() MsgBox "x, is " & x End Sub

  3. Macro1 を実行すると、次のメッセージが表示されます。

    x, as seen by Macro1 is 10

  4. [ OK] をクリックすると、次のメッセージが表示されます。

    x, as seen by Macro2 is

  5. [OK] をクリックします。

変数 x は Macro1 に対してローカルであるため、Macro2 では変数 x の値は表示されません。

プライベートとパブリックのモジュール レベルのスコープ

モジュールの宣言セクション (モジュールの先頭、すべてのサブプロシージャの上) で変数を定義し、Public ステートメント、Dim ステートメント、または Private ステートメントを使用して変数のスコープを設定できます。 Public ステートメントを変数の前に配置すると、プロジェクト内のすべてのモジュール内のすべてのマクロで変数を使用できるようになります。 Dim ステートメントまたは Private ステートメントを変数の前に配置した場合、変数は宣言されているモジュール内のマクロでのみ使用できます。

Public ステートメントと Dim ステートメントの違いを確認するには、次の手順に従います。

  1. 開いているブックを保存して閉じ、新しいブックを開きます。

  2. Visual Basic エディターを起動します。

  3. プロジェクトにモジュールを挿入します。

  4. Type the following code into this module:
    
    Public x As Integer
    Sub Macro_1a()
         x = 10
         MsgBox x
         Macro_1b
    End Sub
    Sub Macro_1b()
         x = x * 2
         MsgBox x
         Macro2
    End Sub
    
  5. プロジェクトに別のモジュールを挿入します。

  6. このモジュールに次のコードを入力します。
    Sub Macro2()
        x = x * 3
        MsgBox x
    End Sub

  7. 最初 のモジュールMacro_1a マクロを実行します。

  8. 変数 x が "Public x As Integer" として宣言されている場合、プロジェクト内の 3 つのマクロはすべて x の値にアクセスできます。 最初のメッセージ ボックスには、値 10 が表示されます。 2 番目のメッセージ ボックスには、値 20 が表示されます (x はMacro_1bで 2 を乗算するため)。 3 番目のメッセージ ボックスには、値 60 が表示されます (Macro_1bで x の値が 20 に変更され、Macro2 で 3 が乗算されたため)。

  9. 最初のモジュールの宣言行を次から変更します。

       Public x As Integer

    次のように変更します。

       Dim x As Integer

  10. Macro_1a マクロを実行します。

  11. 変数 x が "Dim x As Integer" として宣言されている場合、最初のモジュールのマクロのみが x の値にアクセスできます。 そのため、最初のメッセージ ボックスには値 10 が表示され、2 番目のメッセージ ボックスには値 20 が表示されます (x はMacro_1bで 2 を乗算するため)、3 番目のメッセージ ボックスには 0 の値が表示されます (Macro2 には x の値が表示されず、初期化されていない値の 0 がマクロ 2 で使用されるため)。

  12. 最初のモジュールの宣言行を次から変更します。

      Dim x As Integer

    次のように変更します。

        Private x As Integer

  13. Macro_1a マクロを実行します。

  14. Dim ステートメントを使用していたのと同じメッセージ ボックスが Private ステートメント スコープを使用して表示されます。 変数 x には同じスコープがあり、宣言されているモジュールに対してプライベートです。

メモ: 変数のスコープを宣言されているモジュールに限定する場合は、Dim ステートメントの代わりに Privatestatement を使用します。 どちらも同じ効果を発揮しますが、Private ステートメントを使用する場合は、コードを読むとスコープがより明確になります。
 

変数の有効期間

変数がその値を保持する時間は、有効期間と呼ばれます。 変数の値は有効期間中に変更される可能性がありますが、値は保持されます。 また、変数がスコープを失うと、値が失われます。
 

変数の値を初期化する

マクロを実行すると、すべての変数が値に初期化されます。 数値変数は 0 に初期化され、可変長文字列は長さ 0 の文字列 ("") に初期化され、固定長文字列には ASCII コード 0 が入力されます。 バリアント変数は Empty に初期化されます。 Empty 変数は、数値コンテキストでは 0、文字列コンテキストでは長さ 0 ("") で表されます。

プロシージャ レベルの変数

Dim ステートメントを使用してマクロで宣言された変数がある場合、マクロが実行されている限り、変数はその値を保持します。 このマクロが他のマクロを呼び出す場合、他のマクロも実行されている限り、変数の値は保持されます (ただし、他のマクロでは使用できません)。

プロシージャ レベルの変数のしくみを示すには、次の手順に従います。

  1. プロジェクトに新しいモジュールを挿入します。

  2. このモジュールに、次のマクロの両方を入力します。

    Sub Macro1()
        'set x as a procedure level variable
       Dim x As Integer
       MsgBox "x の初期化された値は" & x
       x = 10
        MsgBox "x is " & x
        '次の行は Macro2 を実行します
        Macro2
        MsgBox "x is still " & x
    End Sub
    Sub Macro2()
        MsgBox "x, as seen by Macro2 is " & x
    End Sub

  3. Macro1 を実行します。

  4. 次のメッセージが表示されます。

        the initialized value of x is 0

  5. [ OK] をクリックすると、次のメッセージが表示されます。

     x is 10

  6. [ OK] をクリックすると、次のメッセージが表示されます。

    x, as seen by Macro2 is

  7. [OK] をクリックします。

  8. 変数 x は Macro1 に対してローカルであるため、Macro2 では変数 x の値は表示されません。 次のメッセージが表示されます。

    x is still 10

  9. [OK] をクリックします。

  10. Macro1 を実行します。

手順 6 で Macro1 の実行が停止するとすぐに変数 x の値が失われたため、手順 3 から 6 で説明されているのと同じメッセージを受け取ります。 そのため、手順 7 で Macro1 を再実行すると、最初のメッセージに x の値が 0 (初期化された値) として表示されます。

静的キーワード (keyword)

静的キーワード (keyword)を使用してプロシージャ レベルの変数が宣言されている場合、変数はプロジェクトがリセットされるまで値を保持します。 したがって、静的変数がある場合、次回プロシージャを呼び出すと、静的変数は最後の値に初期化されます。

静的キーワード (keyword)のしくみを確認するには、次の手順に従います。

1.

Change the code in Macro1 to:

Sub Macro1()
    'set x as a procedure level variable
    Static x As Integer
       MsgBox "the initialized value of x is " & x
    x = x + 10
    MsgBox "x is " & x
End Sub
  1. Macro1 を実行します。

  2. 次のメッセージが表示されます。

    the initialized value of x is 0

  3. [ OK] をクリックすると、次のメッセージが表示されます。

    x is 10

  4. [OK] をクリックします。

  5. Macro1 を実行すると、次のメッセージが表示されます。

    the initialized value of x is 10

  6. [ OK] をクリックすると、次のメッセージが表示されます。

    x is 20

  7. [OK] をクリックします。

メッセージに表示される値は、変数 x が静的変数として宣言され、Macro1 を初めて実行した後も変数の値が保持されるため、2 回目は異なります。

メモ: モジュール レベルの変数がある場合、その有効期間は、静的プロシージャ レベルの変数の場合と同じです。

モジュール レベルの変数の有効期間を確認するには、次の手順に従います。

1.

Change the code in the module that contains Macro1 to the following:

Dim x As Integer  'create a module-level variable
Sub Macro1()
   MsgBox "the initialized value of x is " & x
   x = x + 10
   MsgBox "x is " & x
End Sub
  1. Macro1 を実行すると、次のメッセージが表示されます。

    the initialized value of x is 0

  2. [OK] をクリックすると、次のメッセージが表示されます。

    x is 10

  3. [OK] をクリックします。

  4. Macro1 を実行すると、次のメッセージが表示されます。

    the initialized value of x is 10

  5. [OK] をクリックします。

  6. 次のメッセージが表示されます。

    x is 20

  7. [OK] をクリックします。

メッセージに表示される値は、変数 x が静的変数として宣言され、 Macro1 を初めて実行した後もその値を保持するため、2 回目は異なります。
 

プロジェクトをリセットして変数をリセットする

静的変数またはモジュール レベル変数の値をリセットする場合は、 の [ リセット ] ボタンをクリックします。
ツール バー Standardするか、[実行] メニューの [リセット] をクリックします。

Macro1 プロジェクトに対してこれを行い、Macro1 を再実行すると、変数 x の値が 0 に初期化され、最初のメッセージが表示されます。

    the initialized value of x is 0