VBAで繰り返し処理を行う際、For
ループを使うことが一般的です。
ただし、ループ回数が不定もしくは条件によって途中でループを抜けたい場合にはDo…Loop
が最適です。本記事では、基本構文から実務でよく使う応用例、注意点までを網羅します。
Do…Loopとは?使うメリット
Do
ループは、条件が満たされるまで、または満たされる間、指定した処理を繰り返します。Do…Loop
文は、繰り返し処理を条件に応じて柔軟に実行できるVBAの基本構文です。条件を満たしている間処理を続けたり、条件を満たしたら処理を抜けたりと、柔軟な制御が可能です。
特に「終了条件が明確でない処理」や「ユーザー入力を待つ処理」など、回数が不確定なループに最適です。Exit Do
を組み合わせることで、任意のタイミングでループを終了させることもできます。
- 条件が満たされるまで処理を繰り返す構文(例:「セルが○になるまで」「ユーザーがOKするまで」など)
- 回数が不定・処理中に抜けたいといったケースで有効
For…Next
より柔軟な繰り返し制御が可能
Do…Loopの基本構文(While/Until/先チェック・後チェック)
VBAでは、Do While
、Do Until
を使ってループの「開始前に条件を判定する」構文や、「1回処理してから条件を確認する」後チェック型構文が用意されています。
Do While 条件
:条件が真の間、繰り返す(先チェック)Do Until 条件
:条件が偽の間、繰り返す(先チェック)Do…Loop While 条件
:一度実行し、条件が真なら繰り返す(後チェック)Do…Loop Until 条件
:一度実行し、条件が偽なら繰り返す(後チェック)
繰り返しの前後でどちらに条件を設けるかを適切に選びましょう。
Do While…Loop(先チェック)の書き方
Do While 条件
' 条件がTrueの間、繰り返し
Loop
例: A列にデータがある間、B列に「入力済」と入力し続ける
Sub MarkProcessed()
Dim r As Long: r = 1
Do While Cells(r, 1).Value <> ""
Cells(r, 2).Value = "入力済"
r = r + 1
Loop
End Sub
上記コードを実行すると、下図のようにA列の1~3行目のセルにデータがある場合、B列の1~3行目に「入力済」と入力されます。4行目にはデータが無く、条件式がFalseになるためループを抜けて処理が終了します。

Do Until…Loop(先チェック)の書き方
Do Until 条件
' 条件がFalseの間、繰り返し
Loop
例:A列に空白セルが出るまで黄色に塗りつぶす
Sub HighlightUntilEmpty()
Dim r As Long: r = 1
Do Until Cells(r, 1).Value = ""
Cells(r, 1).Interior.Color = vbYellow
r = r + 1
Loop
End Sub
上記のコードを実行すると、下図のようにA列の1~3行目のセルにデータがある場合、セルの色が黄色に塗りつぶされます。Do While 条件
の例とは異なり、条件式がFalseの場合に処理を実行することに注意してください。4行目にはデータが無く、条件式がTrueになるためループを抜けて処理が終了します。

Do…Loop While(後チェック)の書き方
Do
' 条件がTrueの間、繰り返し(ただし一度は必ず実行する)
Loop While 条件
例:「いいえ」を選択するまでメッセージを表示する
Sub ShowMessagesAtLeastOnce()
Dim userResponse As VbMsgBoxResult
Do
userResponse = MsgBox("もう一度繰り返しますか?", vbYesNo)
Loop While userResponse = vbYes
End Sub
この例では、メッセージボックスを最低1回表示し、ユーザーが「いいえ」を選択するまで繰り返します。Do…Loop While
は後チェックなので、条件に関係なく1回は実行される点が特徴です。
Do…Loop Until(後チェック)の書き方
Do
' 条件がFalseの間、繰り返し(ただし一度は必ず実行する)
Loop Until 条件
例:入力するまで繰り返し
Sub LoopUntilInputValid()
Dim userInput As String
Do
userInput = InputBox("1文字以上入力してください")
Loop Until Len(userInput) > 0
MsgBox "入力された値: " & userInput
End Sub
この例では、ユーザーが何か文字を入力するまで繰り返します。必ず何かしらの入力が必要な場合に有効です。Do…Loop Until
も後チェック構文であり、最低1回は必ず処理が実行されるという特徴があります。
Exit Doで途中終了する方法
Do…Loop
文は条件を満たしている間繰り返しますが、ループ途中で任意の条件に応じて抜けたい場合があります。そのようなときに使えるのが Exit Do
です。
If
文と組み合わせて、「特定の条件を満たしたら即終了」といった制御が簡単に実現できます。これにより処理効率を高めるだけでなく、無限ループを避ける安全対策としても有効です。
例:不連続な値を見つけた場合に途中終了する
Sub LoopWhileSeriesNumber()
Dim i As Long: i = 1
Do While Cells(i, 1) <> ""
If Cells(i, 1) <> i Then
Cells(i, 1).Interior.Color = vbYellow
Exit Do
End If
i = i + 1
Loop
MsgBox "不連続な値" & Cells(i, 1) & "を見つけました"
End Sub
上記コードでは、A列の1行目から順に処理を繰り返す中で、行番号と一致しない値が入力されている場合にループを途中終了してメッセージ表示しています。

Forループとの使い分け
VBAにはもう1つの繰り返し構文「For…Next」があります。For
は繰り返し回数が決まっているときに適しており、Do…Loop
は条件に応じて繰り返す柔軟な処理に向いています。
例えば「1から10まで繰り返す」といった明確な範囲なら For
、「セルに値がある間処理する」など変動条件なら Do
が適しています。
- For…Next:回数が決まっている処理に最適
- Do…Loop:回数が不定、セルの変化や入力待ちなど条件重視の繰り返しがある場合に有利
Doループの実用例2選
Do
ループは実務で非常によく使われます。For
ループとは異なり、繰り返し回数が不定の場合でも使えるため柔軟な使い方ができるのです。下記では実用例を2つ紹介します。
例:エクセルファイルが存在する限り繰り返す
次の例では、ユーザーの選択したフォルダ中に存在するエクセルファイルを全てシート上に書き出す処理を繰り返します。
Sub ProcessFiles()
' フォルダ選択ダイアログを作成
Dim folderDialog As FileDialog
Set folderDialog = Application.FileDialog(msoFileDialogFolderPicker)
' ダイアログを表示し、ユーザーが選択した場合のみ処理
If folderDialog.Show = -1 Then
Dim folderPath As String
folderPath = folderDialog.SelectedItems(1)
Dim fileName As String
fileName = Dir(folderPath & "\*.xlsx")
Do While fileName <> ""
Debug.Print fileName
fileName = Dir()
Loop
Else
MsgBox "フォルダ選択がキャンセルされました"
End If
End Sub
実際に下図のフォルダを選択した場合の結果が右側に書き出されています。

例:特定の文字列が見つかるまで繰り返す
次の例では、特定の文字列を見つけるまで繰り返し、見つけたらExit Do
でループを抜けるようになっています。繰り返す行の範囲については、「B列で入力がある範囲」としており柔軟な使い方に対応しています。
Sub LoopUntilFoundKeyword()
Dim i As Long
i = 1
Do
If Cells(i, 2).Value = "完了" Then
Range(Cells(i, 1), Cells(i, 2)).Interior.Color = RGB(255, 255, 0)
MsgBox "完了を見つけました(" & i & "行目)"
Exit Do
End If
i = i + 1
Loop Until Cells(i, 1).Value = ""
End Sub

ネストや複数条件(AND/OR)の活用
ループ処理をさらに強化したい場合、Do…Loop
を入れ子にする「ネスト」や、複数条件を組み合わせる And
/ Or
を使いましょう。
例えば、「A列が空白でなく、かつ行数が100以下」など、条件を複雑にしてより現実的なデータ処理を実現できます。
Do While Cells(i, 1).Value <> "" And i <= 100
' 複数条件で処理
Loop
よくあるエラーと対策
Do…Loop
では、条件設定を誤ると無限ループが発生するリスクがあります。その他、Do…Loop
でを使う際に注意するべきポイントには下記のようなものがあります。
条件を更新する処理
をループ内に入れ忘れると永久ループに陥ります。DoEvents
を適切に挿入することで、Excelがフリーズしたような状態を防止できます。Do
とLoop
をセットで記述していないことにより、Loop without Do
やDo without Loop
という構文エラーも発生しやすいため、ペアを意識して記述しましょう。
まとめ
Do…Loop
は、条件に応じた繰り返し処理に不可欠な構文です。
While
/Until
によって条件の意味が変わる点を理解しましょう。Exit Do
を組み合わせると、処理の柔軟性が格段にアップします。For
と使い分けて、より効率的なマクロを作成しましょう。
この記事が参考になったら、For
ループ処理に関する記事もぜひご覧ください。