Excel VBAを使いこなすうえで、繰り返し処理は欠かせません。中でも「Do…Loopステートメント」は、条件によって繰り返し処理を柔軟に制御できる便利な構文です。
この記事では、Do…Loopの基本から、Do While、Do Until、Exit Doなどの使い方、活用例までを初心者にもわかりやすく解説します。実務に役立つサンプルコードも交えながら、じっくり掘り下げていきます。
「Do…Loop」は、VBAで一定の条件に基づいて繰り返し処理を実行するためのステートメントです。
繰り返しの条件は、ループの前(Doの後)または後(Loopの後)で指定でき、柔軟な使い方ができます。
基本的な構文は以下のとおりです。
Do While 条件式
' 繰り返し処理
Loop
または
Do
' 繰り返し処理
Loop While 条件式
このように、条件が真(True)の間は繰り返し処理を続けます。
「Do While…Loop」は、条件がTrueの間だけ繰り返し処理を行います。
Sub LoopUntilEmpty()
Dim i As Integer
i = 1
Do While Cells(i, 1).Value <> ""
MsgBox Cells(i, 1).Value
i = i + 1
Loop
End Sub
このコードは、A列の値を上から順に表示していき、空白セルに達したら終了します。
「Do Until…Loop」は、条件がFalseの間だけ繰り返され、条件がTrueになった時にループを終了します。
Sub LoopWithUntil()
Dim i As Integer
i = 1
Do Until Cells(i, 1).Value = ""
MsgBox Cells(i, 1).Value
i = i + 1
Loop
End Sub
この例は、Do Whileと同じ動作に見えますが、条件の書き方が逆になっている点に注意が必要です。
条件式をループの「後」に書くパターンもあります。
Do
' 繰り返し処理
Loop While 条件式
この場合、条件の判定は繰り返し処理が1回終わった「あと」に実行されるため、必ず一度はループ処理が行われます。
Sub AtLeastOnce()
Dim i As Integer
i = 1
Do
MsgBox Cells(i, 1).Value
i = i + 1
Loop Until Cells(i, 1).Value = ""
End Sub
「Exit Do」は、条件とは別に任意のタイミングでループを抜けるために使われます。
Sub ExitLoopOnMatch()
Dim i As Integer
i = 1
Do While Cells(i, 1).Value <> ""
If Cells(i, 1).Value = "終了" Then
Exit Do
End If
i = i + 1
Loop
End Sub
このコードでは、セルの値が「終了」と一致したらループを即座に抜けます。
Do…Loopステートメントは非常に柔軟な反面、条件の設定を間違えると無限ループに陥ることがあります。
Sub InfiniteLoop()
Dim i As Integer
i = 1
Do While i < 10
' iを増やす処理がない!
MsgBox "i = " & i
Loop
End Sub
このようにカウンタの増加処理を忘れると、ループが永遠に終わらない状態になります。
「Do…Loop」と「For…Next」は、どちらも繰り返しに使われますが、以下のような違いがあります。
項目 | Do…Loop | For…Next |
---|---|---|
条件の柔軟さ | 高い(任意の条件) | 固定回数向き |
ループの途中で抜ける | Exit Do | Exit For |
使用場面 | 条件に応じた継続 | 回数が明確な繰り返し |
複雑な繰り返し処理には、複数の条件やループの入れ子(ネスト)も使われます。
Sub SearchTable()
Dim i As Integer, j As Integer
For i = 1 To 10
For j = 1 To 5
If Cells(i, j).Value = "検索" Then
MsgBox "見つけた!行: " & i & " 列: " & j
Exit Sub
End If
Next j
Next i
End Sub
このようにDo…Loopと同じ目的でも、状況に応じてForループを選ぶケースもあります。
Sub DeleteEmptyRows()
Dim i As Long
i = 1
Do While Cells(i, 1).Value <> ""
If WorksheetFunction.CountA(Rows(i)) = 0 Then
Rows(i).Delete
Else
i = i + 1
End If
Loop
End Sub
Sub HighlightValues()
Dim i As Integer
i = 1
Do Until Cells(i, 1).Value = ""
If Cells(i, 1).Value > 100 Then
Cells(i, 1).Interior.Color = RGB(255, 255, 0)
End If
i = i + 1
Loop
End Sub
Do…Loopステートメントは、条件によって柔軟に繰り返し処理を行えるVBAの強力な機能です。
繰り返しの開始タイミングや条件の使い方、ループの途中で抜けるテクニックなどを理解することで、実務での自動化や効率化が飛躍的に向上します。
「繰り返し処理=For…Next」と思い込まず、条件が主役となる処理にはDo…Loopを上手に使ってみてください。