概要
この記事では、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
詳細については、以下の 「バリアント 型」を 参照してください。
変数テストを実行するには、次の手順に従います。
開いているブックを保存して閉じ、新しいブックを開きます。
Visual Basic エディターを起動します (Alt キーを押しながら F11 キーを押します)。
[挿入] メニューの [モジュール] をクリックします。
次のコードを入力します。
Sub Variable_Test()
Dim x As Integer、y As Integer
x = 10
y = 100
MsgBox "x の値は " & x & _
Chr(13) & "y の値は " & y
End SubVariable_Test マクロを実行します。 次のメッセージが表示されます。
the value of x is 10
the value of y is 100[OK] をクリックします。
Variable_Test マクロで、次の行を変更します。
x = 10次のように変更します。
x = "error"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 種類は、プロシージャ レベル、プライベート モジュール レベル、パブリック モジュール レベルです。 スコープは、変数または変数を宣言する方法と場所によって異なります。
プロシージャ レベルのスコープ
プロシージャ レベルのスコープを持つ変数は、宣言されているプロシージャの外部には表示されません。 プロシージャ レベルのスコープを持つ変数の値を設定した場合、その変数の内容は他のマクロには表示されません。
プロシージャ レベルのスコープを持つ変数が宣言されているプロシージャの外部に表示されないことを確認するには、次の手順に従います。
プロジェクトに新しいモジュールを挿入します。
このモジュールに、次のマクロの両方を入力します。
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 SubMacro1 を実行すると、次のメッセージが表示されます。
x, as seen by Macro1 is 10[ OK] をクリックすると、次のメッセージが表示されます。
x, as seen by Macro2 is[OK] をクリックします。
変数 x は Macro1 に対してローカルであるため、Macro2 では変数 x の値は表示されません。
プライベートとパブリックのモジュール レベルのスコープ
モジュールの宣言セクション (モジュールの先頭、すべてのサブプロシージャの上) で変数を定義し、Public ステートメント、Dim ステートメント、または Private ステートメントを使用して変数のスコープを設定できます。 Public ステートメントを変数の前に配置すると、プロジェクト内のすべてのモジュール内のすべてのマクロで変数を使用できるようになります。 Dim ステートメントまたは Private ステートメントを変数の前に配置した場合、変数は宣言されているモジュール内のマクロでのみ使用できます。
Public ステートメントと Dim ステートメントの違いを確認するには、次の手順に従います。
開いているブックを保存して閉じ、新しいブックを開きます。
Visual Basic エディターを起動します。
プロジェクトにモジュールを挿入します。
-
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 プロジェクトに別のモジュールを挿入します。
このモジュールに次のコードを入力します。
Sub Macro2()
x = x * 3
MsgBox x
End Sub最初 のモジュールMacro_1a マクロを実行します。
変数 x が "Public x As Integer" として宣言されている場合、プロジェクト内の 3 つのマクロはすべて x の値にアクセスできます。 最初のメッセージ ボックスには、値 10 が表示されます。 2 番目のメッセージ ボックスには、値 20 が表示されます (x はMacro_1bで 2 を乗算するため)。 3 番目のメッセージ ボックスには、値 60 が表示されます (Macro_1bで x の値が 20 に変更され、Macro2 で 3 が乗算されたため)。
最初のモジュールの宣言行を次から変更します。
Public x As Integer次のように変更します。
Dim x As IntegerMacro_1a マクロを実行します。
変数 x が "Dim x As Integer" として宣言されている場合、最初のモジュールのマクロのみが x の値にアクセスできます。 そのため、最初のメッセージ ボックスには値 10 が表示され、2 番目のメッセージ ボックスには値 20 が表示されます (x はMacro_1bで 2 を乗算するため)、3 番目のメッセージ ボックスには 0 の値が表示されます (Macro2 には x の値が表示されず、初期化されていない値の 0 がマクロ 2 で使用されるため)。
最初のモジュールの宣言行を次から変更します。
Dim x As Integer次のように変更します。
Private x As IntegerMacro_1a マクロを実行します。
Dim ステートメントを使用していたのと同じメッセージ ボックスが Private ステートメント スコープを使用して表示されます。 変数 x には同じスコープがあり、宣言されているモジュールに対してプライベートです。
メモ: 変数のスコープを宣言されているモジュールに限定する場合は、Dim ステートメントの代わりに Privatestatement を使用します。 どちらも同じ効果を発揮しますが、Private ステートメントを使用する場合は、コードを読むとスコープがより明確になります。
変数の有効期間
変数がその値を保持する時間は、有効期間と呼ばれます。 変数の値は有効期間中に変更される可能性がありますが、値は保持されます。 また、変数がスコープを失うと、値が失われます。
変数の値を初期化する
マクロを実行すると、すべての変数が値に初期化されます。 数値変数は 0 に初期化され、可変長文字列は長さ 0 の文字列 ("") に初期化され、固定長文字列には ASCII コード 0 が入力されます。 バリアント変数は Empty に初期化されます。 Empty 変数は、数値コンテキストでは 0、文字列コンテキストでは長さ 0 ("") で表されます。
プロシージャ レベルの変数
Dim ステートメントを使用してマクロで宣言された変数がある場合、マクロが実行されている限り、変数はその値を保持します。 このマクロが他のマクロを呼び出す場合、他のマクロも実行されている限り、変数の値は保持されます (ただし、他のマクロでは使用できません)。
プロシージャ レベルの変数のしくみを示すには、次の手順に従います。
プロジェクトに新しいモジュールを挿入します。
このモジュールに、次のマクロの両方を入力します。
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 SubMacro1 を実行します。
次のメッセージが表示されます。
the initialized value of x is 0[ OK] をクリックすると、次のメッセージが表示されます。
x is 10[ OK] をクリックすると、次のメッセージが表示されます。
x, as seen by Macro2 is[OK] をクリックします。
変数 x は Macro1 に対してローカルであるため、Macro2 では変数 x の値は表示されません。 次のメッセージが表示されます。
x is still 10[OK] をクリックします。
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
Macro1 を実行します。
次のメッセージが表示されます。
the initialized value of x is 0[ OK] をクリックすると、次のメッセージが表示されます。
x is 10[OK] をクリックします。
Macro1 を実行すると、次のメッセージが表示されます。
the initialized value of x is 10[ OK] をクリックすると、次のメッセージが表示されます。
x is 20[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
Macro1 を実行すると、次のメッセージが表示されます。
the initialized value of x is 0[OK] をクリックすると、次のメッセージが表示されます。
x is 10[OK] をクリックします。
Macro1 を実行すると、次のメッセージが表示されます。
the initialized value of x is 10[OK] をクリックします。
次のメッセージが表示されます。
x is 20[OK] をクリックします。
メッセージに表示される値は、変数 x が静的変数として宣言され、 Macro1 を初めて実行した後もその値を保持するため、2 回目は異なります。
プロジェクトをリセットして変数をリセットする
静的変数またはモジュール レベル変数の値をリセットする場合は、 の [ リセット ] ボタンをクリックします。
ツール バー Standardするか、[実行] メニューの [リセット] をクリックします。
Macro1 プロジェクトに対してこれを行い、Macro1 を再実行すると、変数 x の値が 0 に初期化され、最初のメッセージが表示されます。
the initialized value of x is 0