Excel VBAでマクロを書いていると、
ある日突然、次のようなエラーに出会うことがあります。
コンパイル エラー
Next に対する For がありません
このエラーは、
- コードを書き進めている途中で突然出る
- 一見すると For 文は書いてある
- エラー行だけ見ても原因が分からない
といった特徴があり、
初心者はもちろん、中級者でも混乱しやすい構文エラー の代表例です。
さらに厄介なのは、
- エラーが出ている行が「本当の原因」ではない
- 別の場所の修正で突然直る
- コード量が増えるほど原因特定が難しくなる
という点です。
この記事では、
Excel VBAのコンパイルエラー
「Next に対する For がありません」 について、
- エラーの正体
- なぜこのエラーが発生するのか
- 原因パターン別の具体例
- 実務での正しい直し方
- 再発させないための書き方・設計
を、コード例を交えながら体系的に解説します。
目次
- ✅ 「Next に対する For がありません」とは何のエラーか
- ・これは「実行時エラー」ではなく「コンパイルエラー」
- ・VBAは For と Next の「対応関係」を厳密にチェックしている
- ✅ For~Next 文の基本構造を再確認する
- ・最も基本的な For~Next
- ・Next の変数名は省略できるが、構造は省略できない
- ✅ 最も多い原因①:For 文を書き忘れている
- ・Next だけが存在している
- ・対処法:必ず For~Next をセットで確認する
- ✅ 原因②:If や Select Case の中で構造が崩れている
- ・If の End If が抜けている例
- ・対処法:If / End If の対応を確認する
- ✅ 原因③:For が途中で Exit For 以外で終わっている
- ・Exit Sub / Exit Function を誤って使っている
- ・GoTo で For の外に飛んでいる例
- ・対処法:For の中では構造を飛び越えない
- ✅ 原因④:For~Next の入れ子(ネスト)が崩れている
- ・入れ子構造の対応ミス
- ・正しい書き方
- ✅ 原因⑤:コメントアウトによる構造破壊
- ・For だけがコメントアウトされている
- ・対処法:構文単位でコメントアウトする
- ✅ 原因⑥:全角スペース・不可視文字の混入
- ・見た目は For だが、VBAが認識できない
- ・対処法:For / Next を打ち直す
- ✅ デバッグ時の効率的な確認手順
- ・おすすめチェック順
- ✅ 実務で再発させないための書き方
- ・インデントを必ず揃える
- ・1ブロック1責務を意識する
- ✅ RPA(UiPath)連携時の注意点
- ✅ よくある勘違い
- ・「Next の変数名が違うからエラー」
- ・「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 i を If の続きとして解釈しようとして失敗 し、
結果的に
「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 の中では構造を飛び越えない
- GoTo は極力使わない
- 使う場合は For の外で完結させる
参考:【VBA】Application.Gotoメソッドとは:セル・範囲を移動
✅ 原因④: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 を打ち直す
- 問題行を一度削除
- 半角英数で打ち直す
これだけで直ることも多いです。
✅ デバッグ時の効率的な確認手順
※闇雲に探さないことが重要です。
・おすすめチェック順
- エラー行の 直前 を確認
- If / End If の対応
- For / Next の数を数える
- コメントアウト箇所
- ネスト構造
エラー行そのものが原因であることは少ない
これを覚えておくと、特定が早くなります。
✅ 実務で再発させないための書き方
※ここが一番重要です。
・インデントを必ず揃える
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 を「文」ではなく
「ブロック構造」 として意識する習慣を身につけてください。