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

文書翻訳 文書翻訳
文書番号: 843144 - 対象製品
すべて展開する | すべて折りたたむ

目次

はじめに

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

詳細

Sub プロシージャ内の変数

変数に各種のデータを格納する機能は、プログラミング言語の大きな特徴です。これにより、変数の内容を、後からプロシージャ内で使用したり、変更したりできます。この資料では、Visual Basic で変数を使用する際の以下の内容について説明しています。
  • 変数の宣言方法
  • 変数を使用できるプロシージャおよびプロジェクト
  • 変数の有効期間

マクロ内での変数の宣言

マクロ内で変数を宣言する最も簡単な方法は、Dim ステートメントを使用することです。次のコード行では、x および y の 2 つの変数を整数型 (Integer) として宣言しています。
Dim x As Integer, y As Integer
x および y を整数型として指定すると、整数型の変数に必要なメモリ ( x と y のそれぞれに 2 バイトずつ) の確保が Visual Basic に通知されるため、x や y に格納される情報は、それぞれ -32768 〜 32767 の間の整数になります。

: 1 つの Dim ステートメントで複数の変数を宣言する場合は、変数ごとにデータ型を指定する必要があります。

変数ごとにデータ型が指定されていない場合、次の Visual Basic コードの例では、変数 y だけが整数型変数として設定され、変数 x はバリアント型 (Variant) になります。
Dim x, y As Integer
関連情報については、この資料の「バリアント データ型」を参照してください。

変数の動作確認を行うには、次の手順を実行します。
  1. 開いているブックがある場合は、それらのブックを保存して閉じます。次に、新しいブックを開きます。
  2. Visual Basic Editor を起動します (Alt キーを押しながら F11 キーを押します)。
  3. [挿入] メニューの [標準モジュール] をクリックします。
  4. 次のコードを入力します。
    Sub Variable_Test()
    Dim x As Integer, y As Integer
    x = 10
    y = 100
    MsgBox "the value of x is " & x & _
    Chr(13) & "the value of y is " & 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
    

    これを、以下のように変更します。
    x = "error"
    
  8. Variable_Test マクロを実行します。
整数ではない "error" という文字列値を整数型の変数 x に代入しようとしたため、実行時エラーが表示されます。

データ型の概要

以下の表に、変数の一般的なデータ型の一覧を示します。

元に戻す全体を表示する
データ型格納サイズ値の範囲
ブール型 (Boolean) 2 バイト True または False
整数型 (Integer) 2 バイト -32,768 〜 32,767
長整数型 (Long) 4 バイト -2,147,483,648 〜 2,147,483,647
倍精度浮動小数点数型 (Double) 8 バイト 負の値では -1.79769313486232E308 〜 -4.94065645841247E-324、正の値では 4.94065645841247E-324 〜 1.79769313486232E308
通貨型 (Currency) 8 バイト -922,337,203,685,477.5808 〜 922,337,203,685,477.5807
日付型 (Date) 8 バイト 100 年 1 月 1 日〜 9999 年 12 月 31 日
文字列型 (String) 10 バイト + 文字列長

バリアント データ型

変数を宣言する際にデータ型を指定しない場合や、変数をまったく宣言しない場合、この変数には、自動的にバリアント データ型が指定されます。このデータ型で宣言された変数の利点を次に示します。
  • この変数には、文字列、日付、時刻、ブール値、または数値を格納できます。
  • 変数に格納される値を、自動的に変換できます。
バリアント型変数の欠点は、最低でも 16 バイトのメモリが必要ということです。大きなプロシージャや複雑なモジュールでは、16 バイトのメモリが問題になる可能性があります。

Variable_Test マクロ内でのバリアント型変数の動作を確認するには、次の手順を実行します。
  1. 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
    
  2. Variable_Test マクロを実行します。
バリアント型変数の x や y にはいずれの型のデータでも代入できるため、エラーは表示されません。

: 次のコード行を省略しても、変数 x と y はバリアント データ型として扱われるため、マクロは同じように動作します。
Dim x, y

変数のスコープ

変数を宣言したときに、その変数が、同一のモジュール、別のモジュール、または別のプロジェクトにある他のマクロから参照できたり参照できなかったりする場合があります。モジュール内での、このような変数の利用可能範囲は、スコープと呼ばれます。スコープには、プロシージャ レベル、Private モジュール レベル、および Public モジュール レベルの 3 種類があります。スコープは、変数の宣言方法と宣言場所によって異なります。

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

プロシージャ レベルのスコープを持った変数は、その変数が宣言されているプロシージャの外部からは参照できません。プロシージャ レベルのスコープを持った変数の値を設定した場合、その変数の内容は、他のマクロからは参照できません。

プロシージャ レベルのスコープを持った変数が、その変数が宣言されているプロシージャの外部から参照できないことを確認するには、次の手順を実行します。
  1. プロジェクトに新しいモジュールを挿入します。
  2. このモジュールに以下の両方のマクロを入力します。
    Sub Macro1()
    Dim x As Integer
    x = 10
    MsgBox "x, as seen by Macro1 is " & x
    'the next line runs Macro2
    Macro2
    End Sub
    Sub Macro2()
    MsgBox "x, as seen by Macro2 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 の値が表示されません。

Private および Public モジュール レベルのスコープ

変数は、モジュールの Declarations セクション (モジュールの先頭で、すべての Sub プロシージャの前) に定義できます。変数のスコープは、Public ステートメント、Dim ステートメント、または Private ステートメントを使用して設定できます。変数の前に Public ステートメントを指定すると、その変数はプロジェクト内のすべてのモジュールにあるすべてのマクロで利用できます。変数の前に Dim ステートメントまたは Private ステートメントのいずれかを指定すると、その変数は、変数が宣言されているモジュール内のマクロでしか利用できません。

Public ステートメントと Dim ステートメントとの違いを確認するには、次の手順を実行します。
  1. 開いているブックがある場合は、それらのブックを保存して閉じます。次に、新しいブックを開きます。
  2. Visual Basic Editor を起動します。
  3. プロジェクトにモジュールを挿入します。
  4. このモジュールに以下のコードを入力します。
    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. 1 つ目のモジュールの Macro_1a マクロを実行します。

    変数 x を "Public x As Integer" として宣言することにより、プロジェクト内の 3 つのすべてのマクロから x の値にアクセスできます。1 番目のメッセージ ボックスに 10 という値が表示されます。2 番目のメッセージ ボックスに 20 という値が表示されます (Macro_1b 内で x に 2 が掛けられるため)。3 番目のメッセージ ボックスに 60 という値が表示されます ( x の値は、Macro_1b 内で 20 に変わり、次に Macro2 内で 3 が掛けられるため)。
  8. 1 つ目のモジュール内の以下の宣言行を変更します。
    Public x As Integer

    これを、以下のように変更します。
    Dim x As Integer
  9. Macro_1a マクロを実行します。

    変数 x を "Dim x As Integer" として宣言することにより、1 つ目のモジュール内のマクロだけから x の値にアクセスできます。このため、1 番目のメッセージ ボックスに 10 という値が表示され、2 番目のメッセージ ボックスには 20 という値が表示され (Macro_1b 内で x に 2 が掛けられるため)、3 番目のメッセージ ボックスには 0 という値が表示されます (Macro2 では x の値を参照できず、初期化されていない 0 という値が Macro 2 で使用されるため)。
  10. 1 つ目のモジュール内の以下の宣言行を変更します。
    Dim x As Integer

    これを、以下のように変更します。
    Private x As Integer
  11. Macro_1a マクロを実行します。
Private ステートメントのスコープを使用すると、Dim ステートメントを使用した場合と同じメッセージ ボックスが表示されます。変数 x は同じスコープを持っており、その変数が宣言されているモジュールでプライベートになっています。

: 変数が宣言されているモジュールにその変数のスコープを限定したい場合は、Dim ステートメントの代わりに Private ステートメントを使用します。どちらも同じ効果がありますが、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 "the initialized value of x is " & x
    x = 10
    MsgBox "x is " & x
    'the next line runs Macro2
    Macro2
    MsgBox "x is still " & x
    End Sub
    Sub Macro2()
    MsgBox "x, as seen by Macro2 is " & x
    End Sub
    
  3. Macro1 を実行します。

    次のメッセージが表示されます。
    the initialized value of x is 0
  4. [OK] をクリックします。

    次のメッセージが表示されます。
    x is 10
  5. [OK] をクリックします。

    次のメッセージが表示されます。
    x, as seen by Macro2 is
  6. [OK] をクリックします。

    変数 x は Macro1 でローカルになっているため、Macro2 では変数 x の値が表示されません。次のメッセージが表示されます。
    x is still 10
  7. [OK] をクリックします。
  8. Macro1 を実行します。
手順 6. で Macro1 が実行を終了するのと同時に変数 x の値は失われるため、手順 3. 〜 6. に記載したものと同じメッセージが表示されます。このため、手順 7. で Macro1 に制御が戻ったとき、最初のメッセージには 0 という値 (初期化された値) が表示されます。

Static キーワード

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

Static キーワードの動作内容を確認するには、次の操作を実行します。
  1. Macro1 のコードを次のように変更します。
    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
    
  2. Macro1 を実行します。

    次のメッセージが表示されます。
    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. Macro1 を含むモジュールのコードを、次のように変更します。
    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
    
  2. Macro1 を実行します。

    次のメッセージが表示されます。
    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 回目には異なります。

プロジェクトのリセットによる変数のリセット

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

Macro1 プロジェクトでこの操作を行ってから Macro1 を再度実行すると、変数 x の値が再び 0 に初期化され、最初のメッセージが表示されます。
the initialized value of x is 0
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
843145 Visual Basic for Applications の Sub プロシージャ内の配列について
先頭に戻る

プロパティ

文書番号: 843144 - 最終更新日: 2006年12月13日 - リビジョン: 2.0
この資料は以下の製品について記述したものです。
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
キーワード:?
kbvba kbprogramming kbinfo KB843144
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com