- Home ›
- Excel VBA入門 ›
- 基本文法
変数のスコープ(適用範囲)について
VBA で変数を定義する場合、変数を利用できるのは同じプロシージャ内に限定されます。もし同じモジュール内の複数のプロシージャで共通して同じ変数を使用したい場合は変数をプロシージャの外側で宣言する必要があります。ここでは VBA における変数のスコープ(適用範囲)について解説します。
(Last modified: )
変数をプロシージャ内で定義した場合の適用範囲
VBA ではプロシージャの中で宣言した変数は、宣言したプロシージャ内が適用範囲となります。次のサンプルを見てください。変数 num
は「テスト1」プロシージャの中で宣言されているので「テスト1」プロシージャの中でのみ利用できます。「テスト2」プロシージャの中で変数 num
を参照しようとしたり新しい値を代入しようとするとエラーとなります。
Option Explicit Sub テスト1() Dim num As Integer num = 10 End Sub Sub テスト2() num = 15 End Sub
このモジュールでは Option Explicit
を記述しているので宣言されていない変数は使用できません。そのため「テスト2」プロシージャを実行すると「変数が定義されていません」というエラーになります。
逆に、プロシージャが異なれば同じ変数名を使用しても問題ありません。次のサンプルでは「テスト1」と「テスト2」で同じ変数名で変数を定義していますがプロシージャが別なので問題ありません。(同じプロシージャ内で同じ変数名で変数を宣言するとエラーになります)。
Option Explicit Sub テスト1() Dim num As Integer num = 10 End Sub Sub テスト2() Dim num As Integer num = 15 End Sub
変数をプロシージャの外で定義した場合の適用範囲
変数をプロシージャの外で定義した場合、変数の適用範囲はモジュール内となります。そのため、モジュール内にあるすべてのプロシージャで変数が利用できます。次のサンプルをみてください。
Option Explicit Dim num As Integer Sub テスト1() num = 10 End Sub Sub テスト2() num = num + 5 End Sub
変数 num
はプロシージャの外で宣言されています。そのため変数を宣言したのと同じモジュール内にあるすべてのプロシージャでこの変数を利用することができます。
「テスト1」と「テスト2」で使用している変数 num
は同じ変数です。そのためまず「テスト1」を実行したあとで「テスト2」を実行すると、変数 num
にはまず 10 が代入されたあと 5 が加算されるため 15 が代入されます。
なおプロシージャの外で宣言した変数と同じ名前の変数をプロシージャの中で宣言した場合、プロシージャの外で宣言した変数と中で宣言した変数は別の変数として扱われます。次のサンプルを見てください。
Option Explicit Dim num As Integer Sub テスト1() num = 10 End Sub Sub テスト2() Dim num As Integer num = 12 End Sub Sub テスト3() num = num + 5 End Sub
プロシージャの外で変数 num
を宣言し、同じ名前の変数 num
を「テスト2」の中でも宣言しています。この場合、プロシージャの外で宣言した変数と「テスト2」の中で宣言した変数は別の変数として扱われます。そのため「テスト1」「テスト2」「テスト3」と順番に実行した場合、プロシージャの外で宣言した変数 num
にはまず 10 が代入されたあとで「テスト2」が実行されますがここでの処理は変数の値に影響を与えません。そのあとで 5 が加算されるため 15 が代入されます。
-- --
VBA における変数のスコープ(適用範囲)について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
プログラミングや開発環境構築の解説サイトを運営しています。