変数のスコープ(適用範囲)について

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)

逆に、プロシージャが異なれば同じ変数名を使用しても問題ありません。次のサンプルでは「テスト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 が代入されます。

変数をプロシージャの外で定義した場合の適用範囲(1)

なおプロシージャの外で宣言した変数と同じ名前の変数をプロシージャの中で宣言した場合、プロシージャの外で宣言した変数と中で宣言した変数は別の変数として扱われます。次のサンプルを見てください。

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 が代入されます。

変数をプロシージャの外で定義した場合の適用範囲(2)

-- --

VBA における変数のスコープ(適用範囲)について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。