VBAのマクロを実行しようとしたとき、「コンパイルエラー: Next に対応する For がありません。」というダイアログが表示されて処理が止まってしまう——このエラーで悩んでいる方は多いのではないでしょうか。

特にこのエラーで厄介なのが、「ForもNextもちゃんと書いてあるのにエラーになる」という現象です。エラーメッセージを読む限り「For文の書き方が間違っている」と思って何度見直してもForとNextはペアになっている——実はその場合、エラーの真犯人はForでもNextでもなく、For〜Nextブロックの中にある別の制御構造(If・With・Do〜Loopなど)の閉じ忘れであることがほとんどです。

本記事では、Microsoft公式ドキュメント(Office VBA リファレンス)をはじめとする信頼性の高い情報をもとに、「Nextに対応するForがありません」エラーの全発生パターン・見落としやすいケース・インデントを使った視覚的な構造確認方法・正しいループ構文の書き方まで体系的に解説します。

目次

  1. 「Nextに対応するForがありません」とは何か
  2. セットで理解する:「Forに対応するNextがありません」との違い
  3. 原因1:For文の中のIf文にEnd Ifが書かれていない(最頻出)
  4. 原因2:For〜Next自体のNextが書かれていない
  5. 原因3:入れ子(ネスト)のFor〜NextでNextの順番が逆になっている
  6. 原因4:For文の中のWithブロックにEnd Withが書かれていない
  7. 原因5:For文の中のDo〜LoopにLoopが書かれていない
  8. 原因6:For文の中のSelect CaseにEnd Selectが書かれていない
  9. 原因7:Exit Forをfor文の外に書いてしまっている
  10. 原因8:For EachのNextにカウンタ変数を書き間違えた
  11. インデントで構造を見える化する——最強の予防策
  12. For〜Nextの正しい構文まとめ
  13. エラー箇所の特定方法
  14. VBAの制御構造「対応するペア」一覧
  15. 解決方法チェックリスト
  16. よくある質問(FAQ)

1. 「Nextに対応するForがありません」とは何か

「コンパイルエラー: Next に対応する For がありません。」は、VBAがコードをコンパイル(解析)する段階で、Next ステートメントに対応する For ステートメントが正しく見つけられなかったときに発生するエラーです。

Microsoftの公式ドキュメント(Office VBA リファレンス)では、このエラーの原因として以下を定義しています。

  • Next ステートメントが使用されましたが、対応する For ステートメントがありません。
  • For...Next 構造内の他の制御構造のステートメントが適切かどうかを確認します。たとえば、For...Next 構造内で If が使用されている場合に対応する End If がないと、このエラーが発生します。

この2番目の定義が非常に重要です。「Nextに対応するForがありません」というエラーは、For文そのものではなく、For〜Nextブロックの中にある別の制御構造(If・With・Do〜Loopなど)の閉じ忘れが原因であることが多いのです。

このエラーの最大の落とし穴:エラーメッセージがFor文の問題を示唆しているため、「ForとNextの対応関係」ばかりを探してしまい、真の原因(For内のIfなどの閉じ忘れ)になかなか気づけません。「ForとNextがちゃんとある」のにエラーになる場合は、まずFor〜Next内の別の制御構造を確認してください。

このエラーとよく混同されるのが、逆の立場のエラーです。Microsoftの公式ドキュメントには両方が定義されています。

エラーメッセージ意味主な原因
Next に対応する For がありませんNextが見つかったが、対応するForが見当たらないFor内のIf・With等の閉じ忘れ、NextがForより外側に出た
For に対応する Next がありませんForが見つかったが、対応するNextが見当たらないNextの書き忘れ、入れ子のNextが足りない

Microsoftの公式ドキュメントでは「Forに対応するNextがありません」について、「すべての For ステートメントには、一致する Next ステートメントが必要です。外側の For…Next 構造の内側に、不適切に一致する For…Next 構造がないかどうかを確認します。」と定義しています。両方のエラーを理解することで、どちらが発生しても迷わず対処できるようになります。

3. 原因1:For文の中のIf文にEnd Ifが書かれていない(最頻出)

このエラーの最も多い原因です。For〜Nextブロックの内側でIf文を使用したとき、対応する End If を書き忘れると「Nextに対応するForがありません」エラーが発生します。

エラーメッセージを見ると「For文の問題」のように見えるため、For文の周りばかりを探してしまいなかなか原因を見つけられないことがあります。このエラーはFor文の中のIf文など他の制御構造をチェックする必要があります。

Option Explicit

' NG例:For内のIfにEnd Ifがない
Sub Sample_NG1()
    Dim i As Long
    Dim rowEnd As Long
    rowEnd = Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To rowEnd
        If Cells(i, 3).Value >= 80 Then   ' ← If文の開始
            Cells(i, 4).Value = "合格"
        Else
            Cells(i, 4).Value = "不合格"
                                           ' ← End If が抜けている!
    Next i   ' ← コンパイルエラー:Next に対応する For がありません
End Sub
Option Explicit

' OK例:End Ifを追加して対応関係を正しくする
Sub Sample_OK1()
    Dim i As Long
    Dim rowEnd As Long
    rowEnd = Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To rowEnd
        If Cells(i, 3).Value >= 80 Then
            Cells(i, 4).Value = "合格"
        Else
            Cells(i, 4).Value = "不合格"
        End If   ' ← End If を追加
    Next i
End Sub

1行If文を使えばEnd Ifを省略できる場合がある

VBAのIf文でEnd Ifを省略できるのは、If 条件 Then 処理 または If 条件 Then 処理 Else 処理 のように1行で書いた場合のみです。複数行に分けて書いた場合は必ずEnd Ifが必要です。

' End Ifを省略できるパターン(1行If文)
Sub OneLineIf()
    Dim i As Long
    For i = 2 To 10
        ' OK:1行に収まっているのでEnd If不要
        If Cells(i, 1).Value = "" Then Cells(i, 1).Value = "未入力"

        ' OK:ElseもあるがすべてThen以降が1行なのでEnd If不要
        If Cells(i, 2).Value >= 60 Then Cells(i, 3).Value = "合格" Else Cells(i, 3).Value = "不合格"
    Next i
End Sub

4. 原因2:For〜Next自体のNextが書かれていない

For文の処理が終わった後に Next を書き忘れた場合です。すべての For ステートメントには、一致する Next ステートメントが必要です。Nextの書き忘れは「Forに対応するNextがありません」エラーになる場合が多いですが、コードの配置によっては「Nextに対応するForがありません」が出る場合もあります。

Option Explicit

' NG例:NextがないForループ
Sub Sample_NG2()
    Dim i As Long
    For i = 1 To 10
        Cells(i, 1).Value = i   ' 処理
                                 ' ← Next i が書かれていない!
    MsgBox "完了"
End Sub
Option Explicit

' OK例:Nextを正しい位置に追加する
Sub Sample_OK2()
    Dim i As Long
    For i = 1 To 10
        Cells(i, 1).Value = i
    Next i   ' ← ループの終わりにNextを記述
    MsgBox "完了"
End Sub

Nextを書く位置を誤って、ループ対象外の処理の後ろに書いてしまうとループ内に含まれてしまいます。インデント(字下げ)を使ってFor〜Nextの範囲を視覚的に明確にする習慣が重要です。

5. 原因3:入れ子(ネスト)のFor〜NextでNextの順番が逆になっている

For文を入れ子(ネスト)にした場合、Nextは内側のForから順番に対応させる必要があります。外側のForに対応するNextを先に書いてしまうと、対応関係が崩れてエラーになります。

入れ子の場合、繰り返し処理が複雑なので、Nextを追加する場所に注意しましょう。

Option Explicit

' NG例:入れ子のNextの順番が逆(外側→内側になっている)
Sub Sample_NG3()
    Dim i As Long
    Dim j As Long
    For i = 1 To 3       ' 外側のForループ
        For j = 1 To 3   ' 内側のForループ
            Cells(i, j).Value = i * j
    Next i   ' ← 外側のiを先に閉じてしまっている → エラー
    Next j   ' ← 内側のjが後になっている
End Sub
Option Explicit

' OK例:内側のNextを先に、外側のNextを後に記述する
Sub Sample_OK3()
    Dim i As Long
    Dim j As Long
    For i = 1 To 3           ' 外側のForループ
        For j = 1 To 3       ' 内側のForループ
            Cells(i, j).Value = i * j
        Next j   ' ← 内側のjを先に閉じる(正しい)
    Next i       ' ← 外側のiを後に閉じる(正しい)
End Sub

入れ子の基本ルール:「後から開いたものを先に閉じる」

入れ子構造のルールは、「後から開いた(書いた)Forを、先にNextで閉じる」という一点に尽きます。これは入れ子のForだけでなく、後述するWithやDo〜Loopでも同じです。

' 3重ネストの正しい閉じ方
Sub TripleNest()
    Dim i As Long, j As Long, k As Long
    For i = 1 To 3         ' 1番目(最外側)
        For j = 1 To 3     ' 2番目
            For k = 1 To 3 ' 3番目(最内側)
                Cells(i + j, k).Value = i * j * k
            Next k         ' 3番目を先に閉じる
        Next j             ' 2番目を次に閉じる
    Next i                 ' 1番目(最外側)を最後に閉じる
End Sub

6. 原因4:For文の中のWithブロックにEnd Withが書かれていない

For〜Nextの内側でWithブロックを使った場合、End With を忘れると同様のエラーが発生します。Withブロックは「End With」で閉じる必要があります。このエラーメッセージは「まんま」でないことがあり、For〜Next内でIfやWithなどが正しく閉じられていない場合でも同じメッセージが表示されます。

Option Explicit

' NG例:For内のWithにEnd Withがない
Sub Sample_NG4()
    Dim i As Long
    For i = 2 To 10
        With Cells(i, 1)
            .Value = "テスト"
            .Font.Bold = True
            .Interior.Color = RGB(255, 255, 0)
                                  ' ← End With が抜けている!
    Next i   ' コンパイルエラー
End Sub
Option Explicit

' OK例:End Withを追加する
Sub Sample_OK4()
    Dim i As Long
    For i = 2 To 10
        With Cells(i, 1)
            .Value = "テスト"
            .Font.Bold = True
            .Interior.Color = RGB(255, 255, 0)
        End With   ' ← End Withを追加
    Next i
End Sub

7. 原因5:For文の中のDo〜LoopにLoopが書かれていない

For〜Nextブロックの内側でDo〜Loopを使った場合も、Loopの書き忘れや位置の誤りが「Nextに対応するForがありません」エラーを引き起こします。

Option Explicit

' NG例:For内のDo〜LoopにLoopが書かれていない
Sub Sample_NG5()
    Dim i As Long
    Dim cnt As Long
    For i = 1 To 5
        cnt = 1
        Do While cnt <= 3
            Cells(i, cnt).Value = i * cnt
            cnt = cnt + 1
                               ' ← Loop が抜けている!
    Next i   ' コンパイルエラー
End Sub
Option Explicit

' OK例:Loopを追加する
Sub Sample_OK5()
    Dim i As Long
    Dim cnt As Long
    For i = 1 To 5
        cnt = 1
        Do While cnt <= 3
            Cells(i, cnt).Value = i * cnt
            cnt = cnt + 1
        Loop   ' ← Loopを追加
    Next i
End Sub

8. 原因6:For文の中のSelect CaseにEnd Selectが書かれていない

For〜Nextブロックの内側でSelect Caseを使った場合、End Select の書き忘れも同様にエラーを引き起こします。

Option Explicit

' NG例:For内のSelect CaseにEnd Selectがない
Sub Sample_NG6()
    Dim i As Long
    For i = 2 To 10
        Select Case Cells(i, 1).Value
            Case "A"
                Cells(i, 2).Value = 100
            Case "B"
                Cells(i, 2).Value = 80
            Case Else
                Cells(i, 2).Value = 60
                                   ' ← End Select が抜けている!
    Next i   ' コンパイルエラー
End Sub
Option Explicit

' OK例:End Selectを追加する
Sub Sample_OK6()
    Dim i As Long
    For i = 2 To 10
        Select Case Cells(i, 1).Value
            Case "A"
                Cells(i, 2).Value = 100
            Case "B"
                Cells(i, 2).Value = 80
            Case Else
                Cells(i, 2).Value = 60
        End Select   ' ← End Selectを追加
    Next i
End Sub

9. 原因7:Exit Forをfor文の外に書いてしまっている

Exit For は、For〜Nextループから途中で抜けるステートメントです。これをFor文の外側に書いてしまうと、「For…Next 内に対応する Exit For がありません」という関連エラーが発生します。さらに、Exit ForによってFor〜Nextの構造バランスが崩れると「Nextに対応するForがありません」エラーが連動して発生することもあります。

Option Explicit

' NG例:Exit ForがFor〜Nextの外にある
Sub Sample_NG7()
    Dim i As Long
    For i = 1 To 100
        If Cells(i, 1).Value = "終了" Then
            ' 何らかの処理
        End If
    Next i

    Exit For   ' ← For文の外にExit Forを書いてしまっている → エラー
    MsgBox "処理完了"
End Sub
Option Explicit

' OK例1:Exit ForはFor〜Nextの内側に書く
Sub Sample_OK7a()
    Dim i As Long
    For i = 1 To 100
        If Cells(i, 1).Value = "終了" Then
            Exit For   ' ← For内に書く:この行でループを抜ける
        End If
        Cells(i, 2).Value = i
    Next i
    MsgBox "処理完了"
End Sub

' OK例2:ループ後にSubを抜けたいならExit Subを使う
Sub Sample_OK7b()
    Dim i As Long
    For i = 1 To 100
        Cells(i, 2).Value = i
    Next i

    ' ここでSubを抜けたい場合はExit Sub(For外なのでExit Forは使えない)
    Exit Sub
    MsgBox "ここには到達しない"
End Sub

Forから抜けるときは Exit For、Subから抜けるときは Exit Sub、Functionから抜けるときは Exit Function——この3種類の使い分けを覚えておくと混乱しません。

10. 原因8:For EachのNextにカウンタ変数を書き間違えた

For Each〜Nextを使ったループでは、Nextに続けてカウンタ変数名を書くことができます。このとき変数名を書き間違えると「Nextに対応するForがありません」エラーが発生します。なお変数名は省略することもできます。

Option Explicit

' NG例:For EachのNextに書いた変数名が宣言した変数名と異なる
Sub Sample_NG8()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Range("A1").Value = ws.Name
    Next sh   ' ← 「sh」という名前の変数はない → エラー
End Sub
Option Explicit

' OK例1:Nextの変数名をFor Eachで宣言した変数名(ws)と一致させる
Sub Sample_OK8a()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Range("A1").Value = ws.Name
    Next ws   ' ← 変数名をwsに修正
End Sub

' OK例2:Nextに変数名を書かない(省略も可)
Sub Sample_OK8b()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Range("A1").Value = ws.Name
    Next       ' ← 変数名を省略してもOK(エラーにならない)
End Sub

11. インデントで構造を見える化する——最強の予防策

「Nextに対応するForがありません」をはじめとするループ構文エラーの最強の予防策は、インデント(字下げ)を使ってコードの構造を視覚的に見えやすくすることです。字下げを適切に行っていないと、どのIfやWithがどこで閉じられているかがコードを読んでいても判別しにくくなります。

インデントの基本ルール

  • 制御構造(For・If・With・Do〜Loop・Select Caseなど)の内側をTabキーで1段インデントする
  • 制御構造の終わり(Next・End If・End With・Loop・End Select)は対応する開始行と同じインデントレベルに揃える
  • 入れ子になるたびにもう1段インデントを加える
Option Explicit

' インデントあり:構造が一目瞭然
Sub GoodIndent()
    Dim i As Long
    Dim rowEnd As Long
    rowEnd = Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To rowEnd                      ' ← For(レベル0)
        With Cells(i, 1)                     '   ← With(レベル1)
            If .Value >= 80 Then             '     ← If(レベル2)
                Select Case .Value           '       ← Select(レベル3)
                    Case 80 To 89
                        Cells(i, 2).Value = "B"
                    Case 90 To 100
                        Cells(i, 2).Value = "A"
                End Select                   '       ← End Select(レベル3)
            Else
                Cells(i, 2).Value = "C"
            End If                           '     ← End If(レベル2)
        End With                             '   ← End With(レベル1)
    Next i                                   ' ← Next(レベル0)
End Sub
' インデントなし:どのIfがどのEnd Ifか判別困難
Sub BadIndent()
Dim i As Long
Dim rowEnd As Long
rowEnd = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To rowEnd
With Cells(i, 1)
If .Value >= 80 Then
Select Case .Value
Case 80 To 89
Cells(i, 2).Value = "B"
Case 90 To 100
Cells(i, 2).Value = "A"
End Select
Else
Cells(i, 2).Value = "C"
End If
End With
Next i
End Sub

VBEのオートインデント機能を活用する

VBEのデフォルト設定では、Enterキーを押して改行すると前の行と同じインデントレベルが維持されます。また「ツール」→「オプション」→「編集」タブの「タブ間隔」でインデント幅を設定できます(標準は4文字)。インデントを後から整理する際は、整形したい複数行を選択してTabキー(右インデント)またはShift+Tabキー(左インデント)を使うと一括で調整できます。

12. For〜Nextの正しい構文まとめ

12-1. 基本的なFor〜Next(カウンタ変数)

' 基本構文
' For カウンタ変数 = 開始値 To 終了値 [Step 増分]
'     処理
' Next [カウンタ変数]

' 例:1から10まで1ずつ加算
For i = 1 To 10
    Cells(i, 1).Value = i
Next i   ' "Next i" でも "Next" でも可

' 例:10から1まで1ずつ減算(Step -1)
For i = 10 To 1 Step -1
    Cells(i, 2).Value = i
Next i

' 例:1から20まで2ずつ加算(奇数のみ)
For i = 1 To 20 Step 2
    Cells(i, 3).Value = i
Next i

12-2. For Each〜Next(コレクション)

' 基本構文
' For Each 要素変数 In コレクション
'     処理
' Next [要素変数]

' 例:全シートのA1セルにシート名を入力
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
    ws.Range("A1").Value = ws.Name
Next ws

' 例:選択範囲の各セルを処理
Dim cell As Range
For Each cell In Selection
    If cell.Value = "" Then cell.Value = "未入力"
Next cell

12-3. Exit Forの正しい使い方

' Exit Forの基本構文(For〜Nextの内側でのみ使用可)
For i = 1 To 100
    If Cells(i, 1).Value = "終了" Then
        Exit For   ' ← ループを途中で抜ける(For〜Nextの内側に書く)
    End If
    Cells(i, 2).Value = "処理済み"
Next i

13. エラー箇所の特定方法

13-1. OKボタンを押してハイライト箇所を確認する

エラーダイアログが表示されたら「OK」を押してください。VBE上でエラーが検出された Next の行が青くハイライトされます。ただし、この Next 自体が間違っているのではなく、その手前にある別の制御構造の閉じ忘れが原因であることがほとんどです。ハイライトされた Next より上のコードを、制御構造のペアが正しく対応しているか確認してください。

13-2. VBEの全体コンパイルで一括確認する

VBEメニューの「デバッグ」→「VBAProjectのコンパイル」を実行すると、プロジェクト全体のコンパイルエラーを実行前にまとめて洗い出せます。複数のエラーが存在する場合でも、1つずつ順番に検出されます。

13-3. コードを上から読み、制御構造のペアを手動で対応させる

インデントが整っていない場合や複雑な入れ子構造の場合は、コードを上から読み進めながら、制御構造の開始と終了を鉛筆などで対応させていく方法が確実です。

' チェック方法:コードを上から読んで「開いた数」と「閉じた数」を数える
' 例:次のコードの対応をカウントする

For i = 2 To 10          ' For ← 開く(For数:1)
    If A > 0 Then        '   If ← 開く(If数:1)
        With Cells(i, 1) '     With ← 開く(With数:1)
            .Value = A   '
        End With         '     End With ← 閉じる(With数:0)
    End If               '   End If ← 閉じる(If数:0)
Next i                   ' Next ← 閉じる(For数:0)

' 最終的にすべてのカウントが0なら正しい構造
' どれかが0にならない(開きっぱなし or 多く閉じた)場合がエラーの原因

13-4. コードを折りたたむ(アウトライン表示)

VBEにはコードを折りたたんで構造を確認するアウトライン機能があります。行番号の左にある「-」マークをクリックするとブロック単位で折りたたみ・展開ができ、入れ子構造の全体像を把握しやすくなります。

14. VBAの制御構造「対応するペア」一覧

「Nextに対応するForがありません」エラーは、For〜Nextだけでなく、その中にある他の制御構造の閉じ忘れでも発生します。VBAの制御構造はすべて「開始」と「終了」がペアになっています。この一覧を頭に入れておくことで、閉じ忘れを素早く発見できます。

制御構造開始終了途中脱出
ForカウンタループFor i = 1 To nNext i(またはNextExit For
For EachループFor Each x In colNext x(またはNextExit For
Do WhileループDo While 条件LoopExit Do
Do UntilループDo Until 条件LoopExit Do
If条件分岐If 条件 ThenEnd If
Select Case条件分岐Select Case 変数End Select
WithブロックWith オブジェクトEnd With
SubプロシージャSub 名前()End SubExit Sub
FunctionプロシージャFunction 名前()End FunctionExit Function

15. 解決方法チェックリスト

「コンパイルエラー: Next に対応する For がありません。」が発生したとき、上から順番に確認してください。

  • エラーダイアログの「OK」を押し、青くハイライトされた Next の行を確認する
  • ハイライトされた Next より上のコードを確認し、For〜Nextブロック内にある If に対応する End If がすべて揃っているか確認する(最頻出)
  • 同様にFor〜Nextブロック内にある With に対応する End With があるか確認する
  • 同様にFor〜Nextブロック内にある Do〜Loop に対応する Loop があるか確認する
  • 同様にFor〜Nextブロック内にある Select Case に対応する End Select があるか確認する
  • For文のNextそのものが書き忘れられていないか確認する
  • 入れ子になったFor〜NextのNextが「内側から外側の順番」に並んでいるか確認する
  • For Each〜NextのNextに書いた変数名が、For Eachで宣言した変数名と一致しているか確認する
  • Exit For がFor〜Nextブロックの内側に書かれているか確認する(外に書いたら Exit Sub に変更する)
  • インデントを整えてコードの構造を視覚的に確認する(各ブロックの開始と終了の数が一致しているか数える)
  • VBEメニューの「デバッグ」→「VBAProjectのコンパイル」で全体コンパイルを実行し、残りのエラーを一括確認する

16. よくある質問(FAQ)

Q1. ForもNextも書いてあるのになぜ「Nextに対応するForがありません」が出るのですか?

このエラーはFor文そのものではなく、For〜Nextブロックの内側にある別の制御構造(If・With・Do〜Loopなど)の閉じ忘れが原因であることがほとんどです。Microsoftの公式ドキュメントでも「For…Next 構造内で If が使用されている場合に対応する End If がないと、このエラーが発生します。」と明記されています。For文の周りではなく、For〜Nextブロック内のIf・With・Selectなどを確認してください。

Q2. 「Nextに対応するForがありません」と「Forに対応するNextがありません」は同じですか?

別のエラーです。「Nextに対応するForがありません」はNextが見つかったが対応するForが見当たらないケースで、主にFor内の別制御構造の閉じ忘れやNextがForの外に出た場合に発生します。「Forに対応するNextがありません」はForが見つかったが対応するNextが書かれていないケースで、Nextの書き忘れや入れ子のNextが足りない場合に発生します。どちらもForとNextのペアの対応関係が崩れていることが原因です。

Q3. Next iとNext(変数名なし)はどちらを使うべきですか?

どちらも動作は同じです。ただし変数名を書いた方(Next i)がコードの可読性が高く、入れ子構造になったときにどのForに対応するNextかが一目でわかるためおすすめです。特にFor〜Nextを複数重ねる場合は変数名を必ず書く習慣を持つとミスが減ります。

Q4. インデントを整えようとしたら余計にわからなくなりました。どうすればよいですか?

まずすべての行のインデントを一旦Shift+Tabで左端に揃えてから、制御構造の開始行を上から順番に読み、内側に入るたびにTabキーで1段ずつインデントをつけていくのが確実です。制御構造の「対応するペア一覧」(本記事の第14節)を参照しながら、対応する終了行も同じインデントレベルになるよう合わせていきましょう。

Q5. Exit ForとExit SubとExit Functionの使い分けがわかりません。

3つの使い分けはシンプルです。Exit For はFor〜Nextループから抜けるときに使い、ループの次の行から処理が続きます。Exit Sub はSubプロシージャそのものを終了させるときに使い、そのプロシージャの処理はすべてそこで止まります。Exit Function はFunctionプロシージャを終了させるときに使います。ループ処理の「途中で条件が揃ったので残りをスキップしたい」場合はExit For、「エラーが起きたのでマクロ全体を止めたい」場合はExit Subを使います。

まとめ

「コンパイルエラー: Next に対応する For がありません。」は、Microsoftの公式ドキュメントでも定義されているとおり、For文そのものではなくFor〜Nextブロック内の別の制御構造(If・With・Do〜Loop・Select Caseなど)の閉じ忘れが最も多い原因です。「ForもNextもあるのにエラーになる」という場合は、まずFor〜Nextブロック内のEnd If・End With・Loop・End Selectが揃っているかを確認してください。

このエラーを根本的に防ぐ最強の習慣はインデント(字下げ)です。制御構造の内側を1段インデントし、終了キーワードを開始と同じレベルに揃えることで、閉じ忘れを視覚的に即座に発見できるようになります。

本記事の「VBAの制御構造対応するペア一覧」と「解決方法チェックリスト」を活用することで、このエラーに遭遇した際も迷わず原因を特定し、正しいループ構文に修正できるはずです。