Excel VBA | 変数のスコープ(適用範囲)

Excel VBA VBA
スポンサーリンク

主な内容の要点

概要

  • VBAで変数を定義する際、「どこで宣言したか」によってその変数を参照できる範囲(スコープ、適用範囲)が変わる。
  • スコープを理解しておかないと、意図しない変数の重複やアクセスエラーが発生する。

スコープのパターンと具体例

1. プロシージャ(サブルーチン/関数)内で宣言する(ローカル変数)

  • Dim を使ってプロシージャ内で変数を宣言すると、その変数はそのプロシージャ内だけで使える。
  • 同じモジュール内の別プロシージャからその変数を参照しようとすると、未定義の変数扱いになりエラーになる。
  • 別のプロシージャにも同じ名前の変数を宣言すれば、それぞれ独立した別個の変数になる。

例:

Sub テスト1()
    Dim num As Integer
    num = 10
End Sub

Sub テスト2()
    num = 15  ' エラー:変数 num が定義されていない
End Sub
VB

また、異なるプロシージャで同じ名前 num を使っても、それぞれ別の変数として扱われる。

2. プロシージャの外で宣言する(モジュールレベルの変数)

  • モジュールの先頭部分(プロシージャ外)で変数を宣言すると、その変数はそのモジュール内のすべてのプロシージャから参照できる。
  • 複数のプロシージャで共通して使いたいデータを持たせたい場合、この方法が使われる。
  • ただし、プロシージャ内で同じ名前でローカル変数を再宣言すると、ローカル変数が優先され、モジュールレベル変数とは別扱いになる。

例:

Dim num As Integer  ' モジュールレベルで宣言

Sub テスト1()
    num = 10
End Sub

Sub テスト2()
    num = num + 5
End Sub
VB

この場合、テスト1テスト2 の順で実行すると、num = 15 になる。

さらに、プロシージャ内で同名のローカル変数を宣言すると、モジュールレベル変数とは別の変数として扱われる。


注意点/補足

  • Option Explicit を使っている場合、すべての変数は明示的に宣言する必要がある。宣言していない変数の使用はコンパイル時にエラーになる。
  • モジュールレベル変数の利便性とリスク:便利だが、意図せず他プロシージャ間で状態が共有され、バグの原因になることもある。
  • 変数名の衝突回避のためには、モジュールの分割や命名規則の徹底が有効。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました