概要
この記事では、Microsoft Microsoft Excel のサブプロシージャで変数を使用する方法についてVisual Basic for Applications。
詳細情報
サブ プロシージャの変数
プログラミング言語の強力な機能は、変数に何かを格納して、変数の内容を使用したり、後で手順で変更したりできる機能です。 このドキュメントでは、次の変数の使用について説明Visual Basic。
-
変数の宣言方法。
-
変数を使用できるプロシージャとプロジェクト。
-
変数の有効期間。
マクロで変数を宣言する
マクロで変数を宣言する最も簡単な方法は、Dim ステートメントを使用する方法です。 次の行は、2 つの変数を整数として宣言します。
Dim x As Integer, y As Integer
x と Visual Basic y を整数として指定すると、整数変数 (x と y ごとに 2 バイト) に対して十分なメモリを確保し、x または y に格納されている情報は -32768 から 32767 の整数を確保する必要があります。
注: 単一の Dim ステートメントを使用して複数の変数を宣言する場合は、変数ごとにデータ型を指定する必要があります。
次のコードと同様に、各変数にデータ型を指定Visual Basic、変数 y だけが整数変数として設定されます。 変数 x はバリアント型です。
Dim x, y As Integer
詳細については、以下の Variant データ 型に関するページを 参照してください。
変数テストを実行するには、次の手順に従います。
-
開いているブックを保存して閉じ、新しいブックを開きます。
-
[エディター] Visual Basicします (Alt キーを押しながら F11 キーを押します)。
-
[挿入]メニューの[モジュール] をクリックします。
-
次のコードを入力します:
Sub Variable_Test()
Dim x As Integer, y As Integer
x = 10
y = 100
MsgBox "x の値は " x & x & _
Chr(13) & "y の値は " & y
End Sub -
次のマクロVariable_Testします。 次のメッセージが表示されます:
the value of x is 10the value of y is 100 -
[OK] をクリックします。
-
次のVariable_Testマクロで、次の行を
変更x = 10 -
to:
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 Macro2() MsgBox "x, seen by Macro2 is " & x End Sub -
Macro1 を実行すると、次のメッセージが表示されます
: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 は 2 を乗算Macro_1b。 3 番目のメッセージ ボックスには、値 60 が表示されます (Macro_1b では x の値が 20 に変更され、Macro2 では 3 が乗算されたためです)。
-
最初のモジュールの宣言行を 次のコマンドから
変更 Public x As Integer
to:
Dim x As Integer -
次のマクロMacro_1aします。
-
変数 x が "Dim x As Integer" として宣言されている場合、最初のモジュールのマクロだけが x の値にアクセスできます。 したがって、最初のメッセージ ボックスには値 10 が表示され、2 番目のメッセージ ボックスには 20 という値が表示され (x は Macro_1b で 2 を掛けたため)、3 番目のメッセージ ボックスには値 0 が表示されます (Macro2 には x の値が表示されないので、マクロ 2 では初期化されていない値 0 が使用されます)。
-
最初のモジュールの宣言行を 次のコマンドから
変更 Dim x As Integer
宛先:
Private x As Integer -
次のマクロMacro_1aします。
-
Dim ステートメントを使用した場合と同じメッセージ ボックスが Private ステートメント スコープを使用して表示されます。 変数 x は同じスコープを持ち、宣言されているモジュールのプライベートです。
注: 変数のスコープを宣言されているモジュールに制限する場合は、Dim ステートメントの代わりに Privatestatement を使用します。 どちらも同じ効果を実現しますが、Private ステートメントを使用する場合、コードを読み取る場合はスコープが明確になります。
変数の有効期間
変数が値を保持する時間は、その有効期間と呼ばれる。 変数の値は有効期間中に変更される可能性がありますが、値は保持されます。 また、変数がスコープを失った場合は、値を持たなくなりました。
変数の値を初期化する
マクロを実行すると、すべての変数が値に初期化されます。 数値変数は 0 に初期化され、可変長文字列は長さ 0 の文字列 ("") に初期化され、固定長の文字列には ASCII コード 0 が入力されます。 Variant 変数は 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 Sub -
マクロ 1 を実行します。
-
次のメッセージが表示されます。
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] をクリックします。
-
マクロ1 を実行します。
手順 6 で Macro1 の実行が停止するとすぐに変数 x の値が失われたため、手順 3 から 6 で説明されているのと同じメッセージが表示されます。 そのため、手順 7 で Macro1 を再実行すると、最初のメッセージに x の値が 0 (初期化された値) と表示されます。
静的キーワード
プロシージャ レベルの変数が Static キーワードを使用して宣言されている場合、変数はプロジェクトがリセットされるまでその値を保持します。 そのため、静的変数がある場合は、次回プロシージャを呼び出す場合、静的変数は最後の値に初期化されます。
Static キーワードのしくみを確認するには、次の手順に従います。
-
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 を実行します。
-
メッセージが表示されます: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 は静的変数として宣言され、マクロ 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 は静的変数として宣言され、マクロ 1を初めて実行した後もその値が保持されるため、メッセージに表示される値は 2 回目は異なります。
プロジェクトをリセットして変数をリセットする
静的変数またはモジュール
レベルの変数の値をリセットする場合は、
標準ツール バー、または [実行]メニューの [リセット] をクリックします。
これを Macro1プロジェクトに対して実行し、Macro1を再実行すると、変数 x の値が 0 に初期化され、最初のメッセージが表示されます。
the initialized value of x is 0