VBAでループ処理を書くときに、意外とつまずきやすいのが変数のスコープ(有効範囲)に関するミスです。
ここでは、初心者でも理解しやすいように、ループ処理におけるスコープの基礎と、よくあるエラー、その対処法を紹介します。
目次
1. 変数のスコープとは?
「変数のスコープ」とは、その変数が有効に使える範囲のことです。主に以下の3種類があります:
種類 | 宣言方法 | 有効範囲 |
---|---|---|
プロシージャ内変数 | Dim でSub内に宣言 | そのSub(プロシージャ)内のみ |
モジュールレベル変数 | Dim をSubの外に書く | モジュール内で有効 |
グローバル変数 | Public で宣言 | 全プロジェクトで有効 |
2. よくあるエラー①:変数が見つからない
For i = 1 To 5
'ここでiを使おうとすると、未宣言エラー!
Next i
実はこのコード、i
が宣言されていないと「変数が定義されていません」というエラーになります。
対処法:明示的に宣言する
Dim i As Integer
For i = 1 To 5
Debug.Print i
Next i
特に「Option Explicit」を使っている場合は、すべての変数の宣言が必須になります。
3. よくある勘違い:ブロック内で宣言した変数のスコープ
Sub Sample()
If True Then
Dim i As Integer
i = 10
End If
Debug.Print i '実はエラーにならない
End Sub
VBAでは、If
ブロックの中でDim
した変数は、実はプロシージャ全体で有効になります。
そのため、上記のコードでもDebug.Print i
は正常に動作します。
ただし、見通しが悪くなりバグの元になるため、宣言はブロックの外で行うのが望ましいです。
✅ 推奨:必要なスコープで宣言する
Sub Sample()
Dim i As Integer
If True Then
i = 10
End If
Debug.Print i 'より安全で明確
End Sub
4. 同じ変数名の使い回しによる混乱
別のSubで同じ変数名を使っても、基本的にはそれぞれ独立した変数になります。
Sub Test1()
Dim i As Integer
i = 5
End Sub
Sub Test2()
Dim i As Integer
MsgBox i 'iの値は初期化されて0(Test1のiとは別)
End Sub
5. まとめ
ループ処理でよくあるエラーの原因のひとつが「変数のスコープ」に関する誤解です。
覚えておきたいポイント:
- 変数は使う範囲に合わせて宣言しよう
- Option Explicitでミスを防ごう
- 同じ変数名でもスコープが異なれば別物になる
スコープを正しく理解すれば、予期しないエラーを防ぎ、より安定したコードが書けるようになります。
コメント