- VBAのFor NextとDo Whileの違いがわからない
- ループを途中で抜けたり、スキップする方法が知りたい
- セル範囲や配列をまとめて処理したい
このような疑問にお答えします。
VBAでループ処理を書くとき、For Next・Do While・For Each の3種類から選ぶことになります。それぞれ得意な場面が違うので、使い分けを理解しておくとコードがスッキリします。
この記事では各ループの基本構文から、ループを抜ける方法・よくある使いどころまで、コード例を交えて解説します。
VBAのループ処理とは
ループ処理とは、同じ処理を繰り返し実行する仕組みのことです。たとえば「A1からA100まで順番に値を確認する」といった処理をループで書けば、同じコードを100回書く必要がなくなります。
VBAには主に3種類のループ構文があります。
| 構文 | 向いている場面 |
|---|---|
| For Next | 回数が決まっているループ |
| Do While / Do Until | 条件が満たされるまで繰り返すループ |
| For Each | コレクション(セル範囲・シートなど)の全要素を処理するループ |
それぞれ詳しく見ていきましょう。
For Next文の使い方
For Next は繰り返す回数があらかじめ決まっているときに使います。カウンター変数を使って指定した範囲を1つずつ処理します。
基本構文
For カウンター変数 = 開始値 To 終了値
' 繰り返す処理
Next カウンター変数実際にセルに1〜5の数字を入力する例です。
Sub ForNextSample()
Dim i As Long
For i = 1 To 5
Cells(i, 1).Value = i
Next i
End SubStep でカウントを変える
Step を使うと、カウンターを1ずつではなく任意の数ずつ増減させられます。
' 2ずつ増やす(1, 3, 5, 7, 9)
For i = 1 To 10 Step 2
Debug.Print i
Next i
' 逆順(10, 9, 8 ... 1)
For i = 10 To 1 Step -1
Debug.Print i
Next i逆順ループは、行を下から削除していくときなどに役立ちます。
ネスト(二重ループ)
For Next を入れ子にすると、行と列を同時に処理できます。
Sub NestedLoop()
Dim i As Long, j As Long
For i = 1 To 3 ' 行
For j = 1 To 3 ' 列
Cells(i, j).Value = i * j
Next j
Next i
End SubDo While / Do Until文の使い方
Do ループは繰り返し回数が決まっていないとき、つまり「ある条件を満たす間(または満たすまで)繰り返す」場合に使います。
Do While(条件が真の間繰り返す)
Do While 条件式
' 繰り返す処理
LoopA列のデータを上から順に読んで、空白セルが来たら止める例です。
Sub DoWhileSample()
Dim i As Long
i = 1
Do While Cells(i, 1).Value <> ""
Debug.Print Cells(i, 1).Value
i = i + 1
Loop
End SubDo Until(条件が真になるまで繰り返す)
Do Until は「条件が満たされるまで」繰り返します。Do While の条件を反転させたイメージです。
Sub DoUntilSample()
Dim i As Long
i = 1
Do Until Cells(i, 1).Value = ""
Debug.Print Cells(i, 1).Value
i = i + 1
Loop
End Sub後判定(ループ後に条件チェック)
条件を Loop の後ろに書くと、最低1回は処理を実行してから条件を確認します。
Do
' 最低1回は実行される
処理
Loop While 条件式For Each文の使い方
For Each はコレクションの全要素を順番に処理するときに使います。セル範囲・シート・コレクションなど、「数を数えなくていい」場面で便利です。
セル範囲を処理する
Sub ForEachCells()
Dim cell As Range
For Each cell In Range("A1:A10")
If cell.Value > 100 Then
cell.Interior.Color = RGB(255, 255, 0) ' 黄色でハイライト
End If
Next cell
End Sub全シートを処理する
Sub ForEachSheets()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
Debug.Print ws.Name
Next ws
End Subシート数を気にせず全シートに同じ処理を適用できるので、シート数が変動するブックに便利です。
ループを抜ける・スキップする方法
Exit For / Exit Do でループを抜ける
条件が満たされたタイミングでループを終了させたい場合は Exit For または Exit Do を使います。
Sub ExitForSample()
Dim i As Long
For i = 1 To 100
If Cells(i, 1).Value = "終了" Then
Exit For ' ループを抜ける
End If
Debug.Print Cells(i, 1).Value
Next i
End Sub次のループへスキップする(Continue相当)
VBAには他の言語の continue にあたる構文がありません。GoTo でループの末尾に飛ばすのが一般的な方法です。
Sub SkipSample()
Dim i As Long
For i = 1 To 10
If Cells(i, 1).Value = "" Then GoTo Continue ' 空白はスキップ
Debug.Print Cells(i, 1).Value
Continue:
Next i
End SubGoTo の使いすぎはコードを読みにくくするので、スキップ条件が複雑な場合は処理を別のSubプロシージャに切り出すほうがスッキリします。
よくある使いどころ
最終行まで処理する
データ件数が変動する場合は、最終行を取得してからループします。
Sub ProcessToLastRow()
Dim lastRow As Long
Dim i As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row ' A列の最終行を取得
For i = 2 To lastRow ' 2行目(ヘッダー除く)から最終行まで
Cells(i, 2).Value = Cells(i, 1).Value * 1.1
Next i
End Sub配列の全要素を処理する
配列のループには For Next と UBound の組み合わせが定番です。
Sub ArrayLoop()
Dim arr As Variant
Dim i As Long
arr = Array("Apple", "Banana", "Cherry")
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
End SubLBound / UBound を使うと、配列のサイズが変わってもコードを変更する必要がありません。
まとめ:用途別の使い分け
3種類のループをまとめると次のとおりです。
| 構文 | 使う場面 | 例 |
|---|---|---|
| For Next | 回数が決まっている | 1行目から100行目まで処理する |
| Do While / Until | 条件次第で回数が変わる | 空白セルが出るまで処理する |
| For Each | コレクションの全要素を処理 | 全シート・セル範囲を一括処理する |
迷ったときは「回数が決まっているか?」を判断基準にすると選びやすいです。決まっているなら For Next、決まっていないなら Do ループ、コレクション全体なら For Each と覚えておきましょう。

コメント