なぜFor Nextループで詰まるのか?

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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール