For Nextループは理解できた。本の例題も動いた。
でも自分のデータで使おうとすると、どこかおかしくなる——そんな経験はありませんか?
For Nextループで詰まる理由は、「何回繰り返すか」の数字を固定で書いてしまうことと、ループの中で何が起きているかを追えていないことの2つです。仕組みを理解すれば、詰まるポイントが一気に見えてきます。
この記事では、次のことを解説します。
- For Nextループで詰まる代表的な3つのパターン
- なぜそのパターンで止まるのか
- 実務で使えるFor Nextの書き方
なぜFor Nextループで詰まるのか——3つのパターン
① ループの回数を固定で書いている
本の例題ではこういうコードがよく出てきます。
For i = 1 To 10 Cells(i,1).Value = i
Next i
「1から10まで繰り返す」という固定の回数です。本の例題はデータが10行なので問題ありません。
でも実務のデータは毎日変わります。今日は50行、明日は80行。固定の回数で書いたループは、データが変わるたびに動かなくなります。
実務では最終行を変数で取得して、ループの終わりに使います。
Dim ls_rw As Long
ls_rw = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To ls_rw Cells(i, 1).Value = i
Next i
これでデータが何行になっても自動で対応できます。
② ループの中で行を削除している
「条件に合う行を削除する」処理をFor Nextで書くとき、よくあるミスがあります。
For i = 1 To ls_rw
If Cells(i, 1).Value = "" Then
Rows(i).Delete
End If
Next i
このコードは正しく動きません。理由は、行を削除するとその下の行が上に詰まるからです。
3行目を削除する前と後で、データがどう動くか見てみましょう。
| 行番号 | 削除前 | 削除後 |
|---|---|---|
| 1行目 | Aさん | Aさん |
| 2行目 | Bさん | Bさん |
| 3行目 | (空白)→ 削除 | Dさん ← 4行目だったデータがここに来る |
| 4行目 | Dさん | Eさん |
3行目を削除すると、元々4行目にあった「Dさん」が、繰り上がって新しい3行目になります。
でもループは「次は4行目を見よう」と進みます。新しい4行目には、元々5行目にあった「Eさん」が入っています。つまり、繰り上がってきた「Dさん」(新しい3行目)は、一度もチェックされずに見逃されてしまいます。これが「行がスキップされる」という現象の正体です。
行を削除するループは、下から上に向かって書くことで解決します。
For i = ls_rw To 1 Step -1
If Cells(i, 1).Value = "" Then
Rows(i).Delete
End If
Next i
下から削除していけば、上の行がずれても影響を受けません。「行を削除するループは下から」はVBAの基本パターンです。
③ ループの中で何が起きているか追えていない
ループは同じ処理を繰り返すため、どの繰り返しでおかしくなっているかが分かりにくいです。エラーが出てもどこが原因か見えず、手が止まります。
こういうときはF8キーのステップインが有効です。一回ずつ処理を追うことで、どの繰り返しでどの値が入っているかを確認できます。前回の記事でも紹介した方法ですが、ループでは特に効果を発揮します。
「今何行目を処理しているか」が見えるようになると、原因を絞り込みやすくなります。慣れてきたら、Debug.Printという機能でさらに詳しく確認する方法もあります(詳しくはFAQで紹介します)。
For Nextループを実務で使うための考え方
ループの前に「何回繰り返すか」を変数で用意する
ループを書く前に、まず終了条件を変数で定義する習慣をつけてください。最終行、最終列、対象のシート数など、ループの範囲になるものを先に整理してからコードを書くと、構造がシンプルになります。
ループの中は「1回分の処理」だけを書く
For Nextの中身は「1行分に対して何をするか」だけを書きます。ループの外でやるべき処理(変数の定義、シートの指定など)を中に入れると、同じ処理が何十回も繰り返されて遅くなったり、予期しない動作の原因になります。
まずStep 1で書いてから、Step -1に変える
行の削除が必要かどうか最初から判断しにくい場合は、まずStep 1(上から)で処理を確認してから、必要に応じてStep -1(下から)に変える方法が確実です。最初からStep -1で書こうとすると、ループの終了条件の書き方が混乱しやすいです。
まとめ
For Nextループで詰まる理由は、「固定の回数」「行削除の方向」「中身の追い方」の3つです。
- ループの回数は変数で取得する——データが変わっても対応できる
- 行を削除するループは下から——上から削除すると行がスキップされる
- ループの中はF8とDebug.Printで追う——何が起きているかを可視化する
For Nextループは覚えることが少ない構文ですが、「なぜその書き方をするのか」を理解すると、応用の幅が一気に広がります。
よくある質問
Q. Step -1の使い方を教えてください。
For i = 終了値 To 開始値 Step -1と書きます。たとえば10行目から1行目に向かって処理するならFor i = 10 To 1 Step -1です。行削除を伴う処理では、下から上に向かってループすることで行のズレを防げます。
Q. Debug.Printはどこに出力されますか?
VBEの「イミディエイトウィンドウ」という場所に出力されます。VBEメニューの「表示→イミディエイトウィンドウ」またはCtrl+Gで開けます。ループの中にDebug.Print iと書いておくと、今何行目を処理しているかが一覧で表示され、F8で一つずつ確認するより素早く全体の流れを把握できます。
Q. ループが途中で止まる原因は何ですか?
主な原因は3つです。ループ内でエラーが発生している、終了条件に達していない、ループ中に処理対象のデータが変わっている(行削除など)。F8キーで一行ずつ実行して、どこで止まるかを確認することが原因特定の最短ルートです。
For Nextループを含む、実務で使えるVBAの書き方を体系的に学びたい方は、JIMOVEの動画講座をご覧ください。
Q. ループが途中で止まる原因は何ですか?
主な原因は3つです。ループ内でエラーが発生している、終了条件に達していない、ループ中に処理対象のデータが変わっている(行削除など)。F8キーで一行ずつ実行して、どこで止まるかを確認することが原因特定の最短ルートです。
For Nextループを含む、実務で使えるVBAの書き方を体系的に学びたい方は、JIMOVEの動画講座をご覧ください。
「なぜStep -1で書くのか」まで丁寧に解説しています。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



