VBAテクニック集 VBA一覧 コンパイルエラー・構文エラー デバッグ・エラー処理

【VBA】エラー「Next に対する For がありません」の原因と対策|構文エラーを根本理解

Excel VBAでマクロを書いていると、
ある日突然、次のようなエラーに出会うことがあります。

コンパイル エラー
Next に対する For がありません

このエラーは、

  • コードを書き進めている途中で突然出る
  • 一見すると For 文は書いてある
  • エラー行だけ見ても原因が分からない

といった特徴があり、
初心者はもちろん、中級者でも混乱しやすい構文エラー の代表例です。

さらに厄介なのは、

  • エラーが出ている行が「本当の原因」ではない
  • 別の場所の修正で突然直る
  • コード量が増えるほど原因特定が難しくなる

という点です。

この記事では、
Excel VBAのコンパイルエラー
「Next に対する For がありません」 について、

  • エラーの正体
  • なぜこのエラーが発生するのか
  • 原因パターン別の具体例
  • 実務での正しい直し方
  • 再発させないための書き方・設計

を、コード例を交えながら体系的に解説します。

目次

✅ 「Next に対する For がありません」とは何のエラーか

※ここを誤解すると、永遠に迷います。

・これは「実行時エラー」ではなく「コンパイルエラー」

まず最初に押さえておきたいのは、
このエラーは コンパイルエラー だという点です。

  • マクロを実行する前に出る
  • F5を押した瞬間に止まる
  • コードの文法チェック段階で発生する

つまり、
VBAが「文の構造としておかしい」と判断した時点で出るエラーです。


・VBAは For と Next の「対応関係」を厳密にチェックしている

VBAでは、For 文を書くと、
必ず対応する Next が必要になります。

For i = 1 To 10
    Debug.Print i
Next i

このように、

  • For が始まったら
  • 必ず Next で終わる

という ペア構造 が成立していないと、
VBAはコードを解釈できません。


✅ For~Next 文の基本構造を再確認する

※原因調査の前に、土台を確認します。

・最も基本的な For~Next

Dim i As Long

For i = 1 To 5
    Debug.Print i
Next i
  • For:繰り返しの開始
  • Next:繰り返しの終了

このセットが1組です。


・Next の変数名は省略できるが、構造は省略できない

For i = 1 To 5
    Debug.Print i
Next

これは問題ありません。

しかし、

  • For がない
  • For が途中で途切れている

状態で Next があると、
今回のエラーが発生します。


✅ 最も多い原因①:For 文を書き忘れている

※一番シンプルですが、実務でも普通に起こります。

・Next だけが存在している

Debug.Print "処理開始"

Next i

この場合、
対応する For が存在しない ため、
即エラーになります。


・対処法:必ず For~Next をセットで確認する

  • Next を書いたら、必ず上に For があるか
  • インデントを揃えて、構造を目で追う

これが基本です。




✅ 原因②:If や Select Case の中で構造が崩れている

※見た目は正しくても、内部構造が壊れているパターンです。

・If の End If が抜けている例

For i = 1 To 5
    If i > 3 Then
        Debug.Print i
Next i

一見すると For~Next はありますが、
End If がありません。

この場合、
VBAは Next iIf の続きとして解釈しようとして失敗 し、
結果的に
「Next に対する For がありません」
というエラーになります。


・対処法:If / End If の対応を確認する

For i = 1 To 5
    If i > 3 Then
        Debug.Print i
    End If
Next i

For だけが原因とは限らない
ここがこのエラーの最大の落とし穴です。


✅ 原因③:For が途中で Exit For 以外で終わっている

※ロジック追加時によく起きます。

・Exit Sub / Exit Function を誤って使っている

For i = 1 To 5
    If i = 3 Then
        Exit Sub
    End If
Next i

これは文法的には正しいため、
コンパイルエラーにはなりません。

しかし、
似た構造で GoTo を使うと、
構造エラーの原因になります。

参考:【VBA】処理を止める「Exit」の使い方|Sub・Function・ループでの中断方法を解説


・GoTo で For の外に飛んでいる例

For i = 1 To 5
    If i = 3 Then GoTo EndLabel
Next i

EndLabel:

この場合、
VBAの構文解析が崩れ、
「Next に対する For がありません」
が出ることがあります。


・対処法:For の中では構造を飛び越えない


✅ 原因④:For~Next の入れ子(ネスト)が崩れている

※中級者以上で非常に多い原因です。

・入れ子構造の対応ミス

For i = 1 To 3
    For j = 1 To 3
        Debug.Print i, j
Next i
Next j

このコードでは、

  • 内側:For j
  • 外側:For i

に対して、
Next の順番が逆 になっています。

VBAは、

  • 一番内側の For に対して
  • 最初に Next が来る

というルールで解釈するため、
この構造は破綻します。


・正しい書き方

For i = 1 To 3
    For j = 1 To 3
        Debug.Print i, j
    Next j
Next i

内側から閉じる
これが鉄則です。


✅ 原因⑤:コメントアウトによる構造破壊

※地味ですが、実務で非常に多いです。

・For だけがコメントアウトされている

'For i = 1 To 5
    Debug.Print "test"
Next i

見た目では気づきにくいですが、
For が存在しないため、
Next が孤立します。


・対処法:構文単位でコメントアウトする

'For i = 1 To 5
'    Debug.Print "test"
'Next i

1行だけコメントアウトしない
これが重要です。


✅ 原因⑥:全角スペース・不可視文字の混入

※コピペ時に起きやすい原因です。

・見た目は For だが、VBAが認識できない

  • 全角スペース
  • 全角文字
  • 不可視制御文字

が混ざると、
VBAは正しく構文解析できません。


・対処法:For / Next を打ち直す

  • 問題行を一度削除
  • 半角英数で打ち直す

これだけで直ることも多いです。


✅ デバッグ時の効率的な確認手順

※闇雲に探さないことが重要です。

・おすすめチェック順

  1. エラー行の 直前 を確認
  2. If / End If の対応
  3. For / Next の数を数える
  4. コメントアウト箇所
  5. ネスト構造

エラー行そのものが原因であることは少ない
これを覚えておくと、特定が早くなります。


✅ 実務で再発させないための書き方

※ここが一番重要です。

・インデントを必ず揃える

For i = 1 To 5
    If i > 2 Then
        For j = 1 To 3
            Debug.Print i, j
        Next j
    End If
Next i

インデントが揃っていれば、
構造のズレは一目で分かります。


・1ブロック1責務を意識する

  • For の中に処理を詰め込みすぎない
  • 長くなったら Sub に分ける

これだけで、
構文エラーの発生率は大きく下がります。


✅ RPA(UiPath)連携時の注意点

※直接原因ではないが、間接的に影響します。

RPA連携用マクロは、

  • 条件分岐が多い
  • ループが深くなりやすい

ため、
For~Next の対応ミスが起きやすくなります。

構造をシンプルに保つ設計 が重要です。


✅ よくある勘違い

※遠回りの原因です。

・「Next の変数名が違うからエラー」

→ 変数名は省略可能なので直接原因ではありません。

・「VBAのバグ」

→ ほぼ100%コード構造の問題です。


✅ まとめ:「Next に対する For がありません」エラーの本質

  • これはコンパイルエラー
  • For~Next の構造崩れが原因
  • 真犯人は If / コメントアウト / ネストであることが多い
  • エラー行=原因行とは限らない
  • インデントと構造意識が最大の対策

このエラーを確実に直せるようになると、
VBAコードの 「構造を見る力」 が一段階レベルアップします。

「とりあえず動くコード」から、
「構造が美しく壊れにくいコード」 へ。

ぜひ、
For~Next を「文」ではなく
「ブロック構造」 として意識する習慣を身につけてください。

参考:【VBA】for next で複数条件の処理方法(For Next×If)

    -VBAテクニック集, VBA一覧, コンパイルエラー・構文エラー, デバッグ・エラー処理