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

Excel VBA VBA
スポンサーリンク

「スコープ(変数の有効範囲)」の動作を体感できる例コード+注意点付き解説をまとめます。

1. ローカル変数(プロシージャ内だけ有効)

コード例

Sub Sample1()
    Dim num As Integer
    num = 10
    MsgBox "Sample1 の num = " & num
End Sub

Sub Sample2()
    MsgBox "Sample2 の num = " & num   ' ←ここでエラー!
End Sub
VB

ポイント

  • Dim num As IntegerSample1 の中だけ で使える。
  • Sample2 からは num が存在しないため、「変数が定義されていません」というエラーが出る。
  • つまり、同じ名前でも別の Sub では見えない

注意

別のプロシージャでも同じ名前の変数を宣言すれば使えるが、それぞれ完全に別物。

Sub Sample3()
    Dim num As Integer
    num = 100
    MsgBox "Sample3 の num = " & num
End Sub
VB

Sample1 の num(10)と Sample3 の num(100)は、同じ名前でも全く別の変数


2. モジュールレベル変数(同じモジュール内で共有)

コード例

Dim num As Integer   ' ←モジュールの先頭(Subの外)で宣言!

Sub Sample4()
    num = 10
    MsgBox "Sample4 の num = " & num
End Sub

Sub Sample5()
    num = num + 5
    MsgBox "Sample5 の num = " & num
End Sub
VB

ポイント

  • モジュールの上で宣言すると、そのモジュール内のすべてのSubから見える
  • Sample4Sample5 の順で実行すると:
    • Sample4 実行後 → num = 10
    • Sample5 実行時 → num = 15(前回の値を引き継いでいる)

注意:値が残る!

  • モジュール変数は、Excelを閉じるまで値が保持される(Subを抜けても消えない)。
  • 意図せず前回の値を引きずることがあり、バグの原因になりやすい

3. ローカル変数とモジュール変数が同名の場合

コード例

Dim num As Integer   ' モジュールレベル変数

Sub Sample6()
    Dim num As Integer   ' ←ローカル変数で上書き!
    num = 50
    MsgBox "Sample6 のローカル num = " & num
End Sub

Sub Sample7()
    MsgBox "Sample7 のモジュール num = " & num
End Sub
VB

ポイント

  • Sample6 内で再度 Dim num と宣言したため、モジュール変数とは別扱い
  • 結果:
    • Sample6 → 50(ローカル変数)
    • Sample7 → 0(モジュール変数、初期値のまま)

同名でもローカルが優先される!


4. モジュール変数を他のモジュールでも使いたい場合(Public変数)

コード例

'--- Module1 ---
Public countNum As Integer

Sub SetCount()
    countNum = 5
End Sub
VB
'--- Module2 ---
Sub ShowCount()
    MsgBox countNum   ' Module1 の変数を参照できる!
End Sub
VB

ポイント

  • Public にすると、全モジュール・全プロシージャで共有可能
  • ただし、複数モジュールで Public 名が衝突すると大混乱するため注意。

よくある落とし穴

落とし穴原因回避法
「変数が定義されていません」エラースコープ外からアクセスしている宣言位置を確認 or 引数で受け渡す
値が残り続けて予期せぬ動作モジュール変数が Sub 終了後も生きている必要なら明示的に初期化
同じ名前の変数で上書き混乱ローカルとモジュールで同名宣言命名規則(例:mNum や gCount)を設ける

練習のすすめ

簡単な練習手順:

  1. Excelを開く
  2. Alt + F11 でVBEを開く
  3. 挿入 → 標準モジュール
  4. 上記の各コードを貼り付けて、1つずつ実行(F5キー)
  5. どの変数がエラーになるか/値が引き継がれるかを確認

まとめ

宣言場所有効範囲キーワード代表的な使い道
プロシージャ内そのSub/Function内のみDim一時的な値
モジュール内そのモジュール全体Dimモジュール間共有データ
全モジュール全プロジェクトPublicグローバル設定値など

タイトルとURLをコピーしました