はじめに
VBAで For
ループを使って繰り返し処理を行う際、「特定の条件を満たした時だけ、その回のループ内の残りの処理をスキップして、すぐに次の繰り返しに進みたい」という場面がよくあります。
他のプログラミング言語には、このような場合に Continue For
のような専用の命令が用意されていることがありますが、VBAにはそれに直接対応する命令がありません。
しかし、If
ステートメントの構造を工夫することで、同様の動作を簡単に、そして分かりやすく実現できます。この記事では、For
ループの現在の回を途中で切り上げて、次の回に進むための最も一般的な方法を解説します。
ループ内の処理をスキップするVBAサンプルコード
このマクロは、商品リストを上から順にチェックし、もし「在庫状況」列(C列)が “在庫なし” だったら、その行の金額計算は行わずに、次の商品の行へ処理を移します。
完成コード
' 特定の条件でループ内の後続処理をスキップする
Sub SkipLoopIteration()
Dim i As Long
Const DISCOUNT_RATE As Double = 0.9 ' 10%割引
' 2行目から10行目までをループ
For i = 2 To 10
'--- C列の在庫状況をチェック ---
' もし値が "在庫なし" でなければ、Ifブロック内の処理を実行する
If Cells(i, "C").Value <> "在庫なし" Then
'--- スキップさせたくない、メインの処理 ---
' D列の価格に割引率を掛けて、E列に割引後価格を計算
Cells(i, "E").Value = Cells(i, "D").Value * DISCOUNT_RATE
Debug.Print i & "行目を処理しました。"
End If
' "在庫なし" の場合は、Ifブロックが実行されず、そのまま次のNext iへ進む
Next i
MsgBox "処理が完了しました。"
End Sub
コードの解説
If Cells(i, "C").Value <> "在庫なし" Then ... End If
この If
ブロックの構造が、処理をスキップするための鍵となります。
- 条件式:
Cells(i, "C").Value <> "在庫なし"
は、「C列の値が “在庫なし” ではない」という条件です。 - 動作:
- 条件が
True
の場合(”在庫あり” や空白など)、If
とEnd If
の間に書かれたメインの処理(金額計算など)が実行されます。 - 条件が
False
の場合(”在庫なし” だった場合)、If
とEnd If
の間の処理は全てスキップされ、プログラムはEnd If
の次の行、つまりNext i
に直接進みます。これにより、ループの次の回(次の行)に移ることができます。
- 条件が
GoTo
を使わない理由
ご提示のコードのように GoTo
ステートメントを使ってループの最後にジャンプする方法も機能的には可能ですが、一般的には非推奨とされています。GoTo
を多用すると、プログラムの処理の流れが上から下へという自然な流れではなくなり、コードが非常に読みにくく、メンテナンスしにくい(いわゆる「スパゲッティコード」)ものになる傾向があるためです。
特別な理由がない限りは、If
ブロックで処理を囲む方法のほうが、構造が分かりやすく、安全で推奨される書き方です。
まとめ
今回は、VBAの For
ループ内で、特定の回の処理をスキップして次に進む方法を解説しました。
- VBAには
Continue For
のような専用命令はない。 - 実行したいメインの処理全体を、
If 条件 Then ... End If
で囲むのが、最もシンプルで推奨される方法。
このテクニックを使えば、データリストの中から特定の条件を満たす行だけを対象に処理を行う、といった柔軟な繰り返し処理を、クリーンなコードで記述することができます。