変数のスコープに注意(ループ処理でよくあるエラーと対処法)

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でミスを防ごう
  • 同じ変数名でもスコープが異なれば別物になる

スコープを正しく理解すれば、予期しないエラーを防ぎ、より安定したコードが書けるようになります

コメント

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