MENU

【VBA】Doループを使った繰り返し処理

VBAで繰り返し処理を行う際、For ループを使うことが一般的です。

ただし、ループ回数が不定もしくは条件によって途中でループを抜けたい場合にはDo…Loopが最適です。本記事では、基本構文から実務でよく使う応用例、注意点までを網羅します。

目次

Do…Loopとは?使うメリット

Do ループは、条件が満たされるまで、または満たされる間、指定した処理を繰り返します。Do…Loop文は、繰り返し処理を条件に応じて柔軟に実行できるVBAの基本構文です。条件を満たしている間処理を続けたり、条件を満たしたら処理を抜けたりと、柔軟な制御が可能です。

特に「終了条件が明確でない処理」や「ユーザー入力を待つ処理」など、回数が不確定なループに最適です。Exit Doを組み合わせることで、任意のタイミングでループを終了させることもできます。

  • 条件が満たされるまで処理を繰り返す構文(例:「セルが○になるまで」「ユーザーがOKするまで」など)
  • 回数が不定処理中に抜けたいといったケースで有効
  • For…Nextより柔軟な繰り返し制御が可能

Do…Loopの基本構文(While/Until/先チェック・後チェック)

VBAでは、Do WhileDo 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がフリーズしたような状態を防止できます。
  • DoLoopをセットで記述していないことにより、Loop without DoDo without Loop という構文エラーも発生しやすいため、ペアを意識して記述しましょう。

まとめ

Do…Loopは、条件に応じた繰り返し処理に不可欠な構文です。

  • While/Untilによって条件の意味が変わる点を理解しましょう。
  • Exit Doを組み合わせると、処理の柔軟性が格段にアップします。
  • Forと使い分けて、より効率的なマクロを作成しましょう。

この記事が参考になったら、Forループ処理に関する記事もぜひご覧ください。

この記事を書いた人

うつ病により二度の休職を経験。
現在は自動車メーカー勤務で、開発業務改善に従事。
自身の経験を基にしたメンタル改善のための情報や、仕事を楽にするためのVBAのノウハウ発信をしています。

目次