【2026年7月最新】VBAのWhile・Do Whileループ完全ガイド|While Wend・Do While Loop・Do Loop Whileの使い分けとコード例

【2026年7月最新】VBAのWhile・Do Whileループ完全ガイド|While Wend・Do While Loop・Do Loop Whileの使い分けとコード例

「VBAでセルを上から順に処理したいが、データ件数が毎回変わるのでFor Nextでは書きにくい」「While文とDo While文の違いがよく分からず、どちらを使えばいいか迷う」——VBAでループ処理を書き始めると、条件付きの繰り返し構文の選択で悩むことがあります。

この記事では、VBAの条件付きループ構文であるWhile Wend・Do While Loop・Do Loop Whileの3種類を完全に解説します。それぞれの構文の違い・使い分け・複数条件の指定・Exit Doによる途中終了・無限ループの防ぎ方・For Nextとの使い分けまで、実務で役立つコード例を豊富に交えて説明します。

代表菅澤 代表菅澤
条件付きループは「件数が決まっていない繰り返し処理」の要です。Excelシートのデータ末尾まで処理したい・ファイルが見つかるまで探し続けたい・ユーザーが正しい入力をするまで入力を求め続けたいといった処理に欠かせません。While系の構文をきちんと使いこなすだけで、業務マクロの幅が大きく広がります。
✔️While Wend・Do While Loop・Do Loop Whileの違い:3種類の条件付きループ構文を比較
✔️前判定と後判定の違い:ループ開始前に条件を評価するか、1回実行後に評価するかの差
✔️複数条件の指定方法:AndやOrを使った2つ以上の条件を組み合わせる書き方
✔️Exit Doの使い方:ループの途中で処理を終了させる方法と注意点
✔️無限ループの防ぎ方:意図せず止まらなくなる原因と安全なループ設計
✔️For Nextとの使い分け:繰り返し回数が決まっている場合・決まっていない場合の判断基準
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理
📌 この記事の結論
【2026年7月最新】VBAのWhile・Do Whileループ完全ガイド|While Wend・Do While Loop・Do Loop Whileの使い分けとコード例
VBAのWhile Wend・Do While Loop・Do Loop Whileの違いと使い分けを完全解説。条件付き繰り返し処理の基本構文、複数条件の指定、Exit Doによる途中終了、For Nextとの使い分けまでコード例付きで解説。

01 VBAのループ処理の全体像 For Next・While Wend・Do Loopの3系統と条件付きループの位置づけ

VBAのループ構文は大きく「回数指定ループ」と「条件付きループ」の2系統に分けられます。回数指定ループはFor Next・For Each Nextが代表です。条件付きループはWhile Wend・Do While Loop・Do Loop While・Do Until Loopなどがあります。今回解説するWhile Wend・Do While Loop・Do Loop Whileはすべて「条件付きループ」の仲間です。

VBAのループ構文
回数指定ループ
For Next / For Each Next
条件付きループ
While Wend / Do While / Do Loop While
処理件数が不定な場合に使用
データ末尾・ファイル存在・入力検証

回数指定ループ(For Next)は「10回繰り返す」「配列の全要素を処理する」のように繰り返し回数が事前に決まっているときに使います。これに対して条件付きループは「条件がTrueである間は繰り返す」「データが空白になるまで繰り返す」のように、終了タイミングが実行時の状況によって変わる処理に向いています。

📚 用語解説

条件式:ループの継続・終了を制御するTrueまたはFalseを返す式。VBAではWhile条件式・Do While 条件式・Do Until 条件式のように記述します。比較演算子(=・<>・>・<・>=・<=)・論理演算子(And・Or・Not)・関数の戻り値(IsEmpty・IsNull等)などを組み合わせて記述します。条件がTrue(真)のとき「繰り返す」か「終了する」かは構文によって異なります。

構文種類判定タイミング特徴
While Wend前判定ループループ先頭で評価古い構文・Exit Wend不可・シンプルな記述
Do While Loop前判定ループループ先頭で評価現代的・Exit Do可能・Until条件にも変換可能
Do Loop While後判定ループループ末尾で評価必ず1回以上実行される・Exit Do可能
Do Until Loop前判定ループ(Until)ループ先頭で評価条件が偽の間繰り返す(Whileの逆)
Do Loop Until後判定ループ(Until)ループ末尾で評価後判定・条件が偽の間繰り返す
AI鬼管理山崎 AI鬼管理山崎
「While系」と「Do系」の最大の違いは、Do系には「Exit Do」でループを途中終了できる点です。While Wendには途中終了の手段がなく、GoToを使うしかありません。これが現代VBAではDo系が主流になっている大きな理由です。

02 While Wend文の使い方 古くからあるVBAの条件付きループ構文。シンプルな前判定ループ

📚 用語解説

While Wend文:VBAの条件付き前判定ループ構文。「While 条件式 ~ Wend」の形で記述し、条件がTrueである間ループを繰り返します。VB(Visual Basic)時代から存在する古い構文で、Exit Wendによる途中終了はできません。現代VBAではDo While Loopへの移行が推奨されていますが、シンプルな繰り返し処理では今でも使われます。

While Wend文の基本構文は「While 条件式」「(処理)」「Wend」の3行セットです。条件式がTrueの間、While~Wendの間の処理を繰り返します。条件式がFalseになった時点でWendの次の行に処理が移ります。

' While Wend文の基本構文
Sub WhileWendBasic()
    Dim i As Integer
    i = 1

    While i <= 5           ' i が 5 以下の間繰り返す
        MsgBox "i = " & i
        i = i + 1          ' カウンタを必ず更新する(忘れると無限ループ!)
    Wend

    MsgBox "ループ終了。i = " & i  ' i = 6 になっている
End Sub

' ===
' Excelシートのデータ末尾まで処理するWhile Wendの例
Sub WhileWendSheetScan()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1")
    Dim row As Long
    row = 2  ' 2行目から開始(1行目はヘッダー)

    ' A列が空白になるまで処理を繰り返す
    While ws.Cells(row, 1).Value <> ""
        ' B列の値を2倍にしてC列に記録
        ws.Cells(row, 3).Value = ws.Cells(row, 2).Value * 2
        row = row + 1      ' 次の行へ
    Wend

    MsgBox "処理完了。最終行: " & (row - 1) & "行"
End Sub
代表菅澤 代表菅澤
While Wendで最も大事なのは「条件が必ずFalseになるようにループ内でカウンタや変数を更新する」ことです。i = i + 1のような更新処理を忘れると条件が永遠にTrueのままになり、無限ループに陥ります。While Wendには途中で抜け出す手段(Exit Wend)がないため、無限ループになると強制終了(Ctrl+Break)しか対処法がありません。

2-1. While Wendでセルを走査する実務例

Excelのシート操作でWhile Wendが活躍する典型的なパターンは「データが存在する行を上から順に処理する」です。データ件数が毎回変わる場合(月次レポートなど)、For Nextでは最終行番号を事前に取得する必要がありますが、While Wendでは「空白になるまで」という条件で自然に書けます。

' While Wendで売上データを集計する実務例
Sub SalesAggregationWhileWend()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("売上データ")
    Dim row As Long
    row = 2  ' データ開始行

    Dim totalSales As Double
    Dim countRows As Long
    totalSales = 0
    countRows = 0

    ' A列(日付)が空白になるまで繰り返す
    While ws.Cells(row, 1).Value <> ""
        Dim sales As Double
        sales = CDbl(ws.Cells(row, 3).Value)  ' C列: 売上金額

        ' D列の区分が「本社」の行だけ集計
        If ws.Cells(row, 4).Value = "本社" Then
            totalSales = totalSales + sales
            countRows = countRows + 1
        End If

        row = row + 1
    Wend

    ' 結果を表示
    MsgBox "本社売上合計: " & Format(totalSales, "#,##0") & "円" & vbCrLf & _
           "対象行数: " & countRows & "件", vbInformation
End Sub
💡 While WendはDo While Loopに書き換えられる

While Wend文は、すべてDo While Loop文に書き換えられます。「While 条件」を「Do While 条件」に、「Wend」を「Loop」に変えるだけです。新規に書くコードではExit Doが使えるDo While Loopを推奨しますが、既存のWhile Wendコードをそのまま使うことも問題ありません。

03 Do While Loop文の使い方 現代VBAの主流ループ構文。Exit Doによる途中終了に対応

📚 用語解説

Do While Loop文:VBAの条件付き前判定ループ構文。「Do While 条件式 ~ Loop」の形で記述し、条件がTrueである間ループを繰り返します。While Wendとの最大の違いはExit Doでループを途中終了できる点です。While WendのWendをLoopに替え、WhileをDo Whileに替えた形が基本パターンです。現代VBAでは条件付きループのデファクトスタンダードです。

Do While Loop文の基本構文は「Do While 条件式」「(処理)」「Loop」の3行セットです。While Wendと同じく「前判定ループ」で、ループに入る前に条件を評価します。条件がFalseであればループ本体を一度も実行せずに抜けます。

' Do While Loopの基本構文
Sub DoWhileBasic()
    Dim counter As Integer
    counter = 1

    Do While counter <= 10    ' counter が 10 以下の間繰り返す
        Debug.Print "counter = " & counter
        counter = counter + 1
    Loop

    MsgBox "完了。counter = " & counter  ' 11 になっている
End Sub

' ===
' 初回から条件がFalseの場合は一度も実行されない
Sub DoWhileZeroExecution()
    Dim x As Integer
    x = 100  ' 最初から条件(x <= 5)がFalse

    Do While x <= 5    ' この条件は最初からFalse
        MsgBox "実行される(はずだが実際には実行されない)"
        x = x + 1
    Loop

    MsgBox "ループ本体は一度も実行されませんでした。x = " & x  ' x = 100 のまま
End Sub
AI鬼管理山崎 AI鬼管理山崎
Do While Loopの「前判定」という特性は重要です。ループに入る前に条件を確認するので、最初から条件がFalseなら0回しか実行されません。「データが1件もない場合はループをスキップしたい」という場合は前判定のDo While Loopが適しています。一方で「少なくとも1回は処理を実行したい」場合はDo Loop Whileを使います。

3-1. Do While Loopでセルを走査する実務例

ExcelシートのA列を上から走査して、データがある行だけを処理する典型的なパターンをDo While Loopで実装します。このパターンは業務マクロで最もよく使うループ形式の一つです。

' Do While Loopでシートデータを走査・整形する実務例
Sub SheetScanDoWhile()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("受注データ")

    ' 最終行を先に取得(Cells.Find方式)
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    Dim row As Long
    row = 2  ' 2行目からデータ開始

    Dim processedCount As Long
    Dim skippedCount As Long
    processedCount = 0
    skippedCount = 0

    Do While row <= lastRow    ' 最終行に達するまで繰り返す
        Dim cellVal As String
        cellVal = Trim(ws.Cells(row, 1).Value)  ' A列: 顧客名

        If cellVal = "" Then
            ' 空白行はスキップ
            skippedCount = skippedCount + 1
        Else
            ' B列: 金額を数値型に変換してC列に丸め処理
            Dim amount As Double
            amount = CDbl(ws.Cells(row, 2).Value)
            ws.Cells(row, 3).Value = Int(amount / 1000) * 1000  ' 千円単位に切り捨て

            ' D列: 処理済みフラグを設定
            ws.Cells(row, 4).Value = "処理済"
            ws.Cells(row, 4).Interior.Color = RGB(198, 239, 206)  ' 緑背景
            processedCount = processedCount + 1
        End If

        row = row + 1  ' 必ず次の行へ進める
    Loop

    MsgBox "処理完了" & vbCrLf & _
           "処理行: " & processedCount & "件" & vbCrLf & _
           "スキップ(空白): " & skippedCount & "件", vbInformation
End Sub
💡 lastRow取得は Cells.End(xlUp).Row が定番

Do While Loopでシートを走査するとき、「最終行はどこか」を事前に知っておくパターンが安全です。ws.Cells(ws.Rows.Count, 1).End(xlUp).Rowは「A列の最後の行から上方向にCtrl+↑した行番号」を返す定番の書き方です。これを使ってDo While row <= lastRowとすれば、データ件数に関係なく安全に走査できます。

Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

04 Do Loop While文(後判定ループ)の使い方 必ず1回以上実行したいときに使う後判定ループ構文

📚 用語解説

Do Loop While文(後判定):VBAの条件付き後判定ループ構文。「Do ~ Loop While 条件式」の形で記述し、ループ末尾で条件を評価します。「前判定」のDo While Loopと異なり、条件の評価がループ本体の実行後に行われるため、条件に関わらず必ず最低1回はループ本体が実行されます。ユーザーへの入力要求・初回処理が必須の処理など「少なくとも1回は実行したい」場合に使います。

Do Loop While文は「まず処理を実行してから条件を評価する」後判定ループです。条件式の位置がLoopキーワードの後ろにある点がDo While Loopと異なります。最初から条件がFalseであっても、ループ本体が1回実行された後に条件を確認して終了します。

' Do Loop Whileの基本構文(後判定:必ず1回実行される)
Sub DoLoopWhileBasic()
    Dim x As Integer
    x = 100  ' 最初から条件(x <= 5)がFalseだが...

    Do
        MsgBox "x = " & x & "(条件がFalseでも1回は実行される)"
        x = x + 1
    Loop While x <= 5    ' ← 条件の評価はここ(ループ末尾)

    ' x = 101 で終了(1回だけ実行された)
    MsgBox "終了。x = " & x
End Sub

' ===
' ユーザーに正しい入力を求め続ける(入力検証ループ)
Sub InputValidationLoop()
    Dim userInput As String

    Do
        userInput = InputBox("1〜10の整数を入力してください")

        ' キャンセルボタン押下時(InputBoxが空文字列を返す)
        If userInput = "" Then
            MsgBox "キャンセルされました", vbInformation
            Exit Sub
        End If

        ' 数値かつ範囲内かチェック
        If IsNumeric(userInput) Then
            If CInt(userInput) >= 1 And CInt(userInput) <= 10 Then
                Exit Do  ' 正しい入力 → ループを抜ける
            End If
        End If

        MsgBox "1〜10の整数を入力してください", vbExclamation
    Loop While True  ' ← Exit Doで抜けるまで繰り返す(条件は常にTrue)
    ' ※ Loop While True より Loop While False の逆を使う場合もある

    MsgBox "入力値: " & CInt(userInput), vbInformation
End Sub
代表菅澤 代表菅澤
Do Loop Whileが真価を発揮するのは「ユーザーへの入力要求」や「処理を実行してから成否を確認する」パターンです。InputBoxでユーザーに入力を求めるループは、「少なくとも1回は入力ダイアログを出す」必要があるので後判定が自然です。Exit Doを使って正しい入力が得られたらループを抜ける設計がきれいに書けます。
⚠️ 後判定ループでも無限ループに注意

Do Loop Whileも無限ループになる可能性があります。特に「Loop While True」と書いてExit Doでしか抜けないパターンは、Exit Doの条件を誤って書くと永遠に終わらなくなります。後判定ループを使うときも「Exit Doが必ず到達できる条件になっているか」を確認してください。また、カウンタを使う場合はDo While Loopと同様にカウンタの更新を忘れないようにしましょう。

05 While WendとDo Whileの違いと使い分け 3種類の条件付きループを状況に応じて選択する判断基準

While Wend・Do While Loop・Do Loop Whileの3種類は、いずれも「条件付きループ」ですが、使い分けのポイントがあります。大きな判断軸は「前判定か後判定か」と「途中終了(Exit Do)が必要か」の2点です。

条件付きループの選択
必ず1回実行?
Yes→後判定
No→前判定
途中終了が必要?
Yes→Do系
No→どちらでもOK
構文選択
後判定: Do Loop While
前判定+Exit: Do While
前判定シンプル: While Wend
判断ポイントWhile WendDo While LoopDo Loop While
判定タイミング前判定前判定後判定
途中終了(Exit)不可(GoTo必要)Exit Do で可能Exit Do で可能
0回の実行条件次第で0回条件次第で0回必ず1回以上実行
Until条件への変換不可Do Until Loopに変換可Do Loop Untilに変換可
新規コードでの推奨非推奨(レガシー)◎ 推奨条件に応じて使用
AI鬼管理山崎 AI鬼管理山崎
実務での選択指針は明快です。新規に書くコードはDo While Loopをデフォルトにします。「必ず1回は実行したい」(入力検証・初回接続試行など)のときだけDo Loop Whileを選びます。While Wendは既存コードの読み取りのために理解しておく程度でよく、新規コードでは使いません。
💡 Do Until LoopはDo While Loopの「逆条件版」

Do While Loopの「条件がTrueの間繰り返す」に対し、Do Until Loopは「条件がTrueになるまで繰り返す(条件がFalseの間繰り返す)」です。たとえば「Do While ws.Cells(row, 1).Value <> ""」は「Do Until ws.Cells(row, 1).Value = ""」と書き換えられます。どちらが読みやすいかは状況次第ですが、統一感を持たせるためにチーム内でどちらを使うか決めておくことをお勧めします。

📚 用語解説

For Next文:VBAの回数指定ループ構文。「For カウンタ変数 = 開始値 To 終了値 [Step 増分] ~ Next カウンタ変数」の形で記述します。繰り返し回数が事前に決まっている処理(配列の全要素処理・固定回数の試行など)に向いています。Do While Loopと異なり繰り返し回数が固定されるため、ループ変数の更新し忘れによる無限ループが発生しない安全な構文です。

06 複数条件(And/Or)の指定方法 AndやOrを使ってWhile/Do Whileの条件を組み合わせる書き方

📚 用語解説

条件式(複数条件):VBAのWhile・Do While文では、And(論理積:両方の条件がTrueのときTrue)・Or(論理和:どちらか一方がTrueのときTrue)・Not(否定:TrueとFalseを反転)を使って複数の条件を組み合わせられます。複数条件を書くときは括弧を使って優先順位を明示することで、意図しない評価順序のバグを防げます。

While・Do While文の条件式にはAndやOrを使って複数の条件を組み合わせられます。たとえば「A列が空白でない かつ B列が0より大きい」や「処理件数が上限に達するか エラーが発生するまで繰り返す」といった複合条件が書けます。

' And(かつ)で複数条件を組み合わせる例
Sub MultiConditionAnd()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("データ")
    Dim row As Long
    row = 2
    Dim maxRows As Long
    maxRows = 1000  ' 安全上限(無限ループ防止)

    ' A列が空白でない AND 処理行が上限未満の間繰り返す
    Do While ws.Cells(row, 1).Value <> "" And row <= maxRows
        ' B列の数値が正の値のときだけ処理
        If ws.Cells(row, 2).Value > 0 Then
            ws.Cells(row, 3).Value = ws.Cells(row, 2).Value * 1.1  ' 10%増
        End If
        row = row + 1
    Loop

    If row > maxRows Then
        MsgBox "上限行数に達しました(" & maxRows & "行)。処理を中断しました。", vbWarning
    Else
        MsgBox "処理完了。処理行数: " & (row - 2) & "件", vbInformation
    End If
End Sub

' ===
' Or(または)で複数条件を組み合わせる例
Sub MultiConditionOr()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("処理キュー")
    Dim row As Long
    row = 2
    Dim errorOccurred As Boolean
    errorOccurred = False

    ' ステータスが「待機」または「再試行」のセルを処理する
    Do While ws.Cells(row, 1).Value = "待機" Or ws.Cells(row, 1).Value = "再試行"
        ' C列の処理を実行
        On Error Resume Next
        ws.Cells(row, 4).Value = ws.Cells(row, 2).Value * ws.Cells(row, 3).Value
        If Err.Number <> 0 Then
            ws.Cells(row, 1).Value = "エラー"
            errorOccurred = True
            Err.Clear
        Else
            ws.Cells(row, 1).Value = "完了"
        End If
        On Error GoTo 0
        row = row + 1
    Loop

    If errorOccurred Then
        MsgBox "一部の行でエラーが発生しました。ステータスを確認してください。", vbWarning
    Else
        MsgBox "全行処理完了", vbInformation
    End If
End Sub
代表菅澤 代表菅澤
複数条件で最もよく使うパターンが「データ条件 And 安全上限」です。たとえばDo While row <= lastRow And row <= 10000のようにデータ件数チェックと安全上限を両方書くことで、万が一lastRowの取得が誤っていても無限ループに陥らない安全設計になります。本番業務マクロでは必ずこのような安全上限を入れることをお勧めします。
' Notで条件を反転させる例(Do Until と同等の書き方)
Sub NotConditionExample()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim row As Long
    row = 2

    ' 「A列が空白である」の否定 = 「A列が空白でない」間繰り返す
    ' Do While ws.Cells(row, 1).Value <> "" と同等
    Do While Not (ws.Cells(row, 1).Value = "")
        Dim name As String
        name = Trim(ws.Cells(row, 1).Value)

        ' 空白文字のみの場合もスキップ(IsEmpty・Len両方確認)
        If Len(name) > 0 And Not IsEmpty(ws.Cells(row, 1).Value) Then
            ws.Cells(row, 2).Value = UCase(Left(name, 1)) & Mid(name, 2)  ' 先頭を大文字化
        End If

        row = row + 1
    Loop
End Sub
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

07 Exit Doで途中終了する方法 ループの途中で特定条件が満たされたら即座に抜ける設計パターン

📚 用語解説

Exit Do:Do While Loop・Do Loop While文の中で使えるループ途中終了ステートメント。Exit Doに達した時点でLoopキーワードの次の行に処理が移ります。While Wendには対応するExit Wendがないため、While Wendをネストして使う場合のループ途中終了はGoToが必要でした。Exit Doは「エラーが発生したとき」「目的のデータが見つかったとき」「処理件数の上限に達したとき」などに使います。

Exit Doは「ループをその場で終了して、ループの次の処理に進む」ステートメントです。Do While Loop・Do Loop Whileの中でのみ使えます。ループの継続条件とは別に「このような場合はループを即座に終了したい」という条件がある場合に使います。

' Exit Doで特定条件が満たされたらループを抜ける
Sub ExitDoSearchExample()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("顧客一覧")
    Dim row As Long
    row = 2

    Dim targetName As String
    targetName = InputBox("検索する顧客名を入力してください")

    Dim foundRow As Long
    foundRow = 0

    Do While ws.Cells(row, 1).Value <> ""
        If ws.Cells(row, 1).Value = targetName Then
            foundRow = row  ' 見つかった行番号を記録
            Exit Do         ' ← ここで即座にループを抜ける
        End If
        row = row + 1
    Loop

    If foundRow > 0 Then
        MsgBox targetName & "は" & foundRow & "行目に見つかりました。" & vbCrLf & _
               "会社名: " & ws.Cells(foundRow, 2).Value, vbInformation
    Else
        MsgBox targetName & "は見つかりませんでした", vbExclamation
    End If
End Sub

' ===
' エラーが発生したらExit Doでループを中断する例
Sub ExitDoOnError()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim row As Long
    row = 2
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    Dim hasError As Boolean
    hasError = False

    Do While row <= lastRow
        On Error Resume Next
        ' 外部システムへのデータ書き込み(エラーが起きる可能性)
        Dim result As Double
        result = ws.Cells(row, 2).Value / ws.Cells(row, 3).Value

        If Err.Number <> 0 Then
            ' エラーが発生 → エラー情報を記録してループを中断
            ws.Cells(row, 4).Value = "ERROR: " & Err.Description
            hasError = True
            Err.Clear
            On Error GoTo 0
            Exit Do    ' ← エラー発生時にループを即終了
        End If
        On Error GoTo 0

        ws.Cells(row, 4).Value = result
        row = row + 1
    Loop

    If hasError Then
        MsgBox row & "行目でエラーが発生したため処理を中断しました。", vbCritical
    Else
        MsgBox "全行処理完了(" & lastRow - 1 & "件)", vbInformation
    End If
End Sub
⚠️ Exit DoはネストしたDo Loopの最内側のLoopを抜ける

Do Loopをネスト(入れ子)している場合、Exit Doは最も内側のDo Loopだけを抜けます。外側のDo Loopには影響しません。外側のループも終了させたい場合は、フラグ変数(Boolean型)を使って外側のループの条件にフラグを組み込む設計が必要です。また、For Nextのループから抜けるにはExit Forを使います。Exit DoはFor Nextには使えないので注意してください。

08 無限ループとデバッグ方法 意図せずマクロが止まらなくなる原因と安全なループ設計

無限ループとは、ループの終了条件が満たされることなく永遠に実行し続ける状態です。While Wend・Do While Loopで最も陥りやすいミスです。発生するとExcelが応答なし状態になり、Ctrl+Breakキーで強制中断するしか方法がなくなります(場合によってはタスクマネージャーで終了が必要)。

' 無限ループになる典型的なミス
Sub InfiniteLoopBad()
    Dim i As Integer
    i = 1

    ' NG例1: カウンタ更新忘れ
    Do While i <= 10
        Debug.Print i
        ' i = i + 1 を書き忘れ! → i は常に 1 → 無限ループ
    Loop

    ' NG例2: 条件が永遠にTrueになる
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim row As Long
    row = 2

    Do While ws.Cells(row, 1).Value <> ""
        ws.Cells(row, 2).Value = ws.Cells(row, 1).Value
        ' row = row + 1 を書き忘れ! → 常に2行目を処理 → 無限ループ
    Loop
End Sub

' ===
' 安全なループ設計(カウンタ上限 + 更新を確実に)
Sub SafeLoopDesign()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim row As Long
    row = 2
    Const MAX_ROWS As Long = 100000  ' 安全上限の定数化

    Dim loopCount As Long
    loopCount = 0

    Do While ws.Cells(row, 1).Value <> "" And loopCount < MAX_ROWS
        ws.Cells(row, 2).Value = ws.Cells(row, 1).Value * 2
        row = row + 1         ' 必ずループの最後で更新
        loopCount = loopCount + 1  ' 安全カウンタも更新
    Loop

    If loopCount >= MAX_ROWS Then
        MsgBox "安全上限(" & MAX_ROWS & "行)に達しました。データを確認してください。", vbWarning
    End If
End Sub
⚠️ Ctrl+Breakで強制停止できないケースがある

Application.EnableCancelKey = xlDisabledを設定していると、Ctrl+Breakによる強制停止ができなくなります。デバッグ中にこの設定が残っていると、無限ループから抜け出せなくなります。EnableCancelKeyをxlDisabledに設定するコードは、必ず処理の直前だけに限定し、処理後にxlInterruptWithMessageOrxlErrorHandlerに戻すか、On Errorでリセットするように設計してください。

AI鬼管理山崎 AI鬼管理山崎
無限ループが起きたときの対処は「Ctrl+Break(または「Esc」キー)でマクロを強制停止」です。Excelが完全にフリーズした場合はタスクマネージャー(Ctrl+Shift+Esc)からExcelプロセスを終了します。この場合は保存していない変更が失われるため、開発中は頻繁に保存する習慣が重要です。
💡 DoEventsでExcelの応答を保ちながらループを実行

DoEvents関数をループ内に入れると、Excelが他のイベント(キー入力・マウス操作など)を処理できるようになります。これにより「長いループの実行中でもCtrl+Breakで停止できる」「画面が更新される」という効果があります。ただしDoEventsは処理速度を落とす副作用があるため、長大なループや視覚的なフィードバックが必要な場合にのみ使います。

' DoEventsでループの途中でも操作を受け付ける設計
Sub SafeLoopWithDoEvents()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim row As Long
    row = 2

    Application.ScreenUpdating = False  ' 画面更新を止めて高速化

    Do While ws.Cells(row, 1).Value <> ""
        ' 重い処理...
        ws.Cells(row, 2).Value = ws.Cells(row, 1).Value

        ' 100行ごとにDoEventsを呼び出して停止可能にする
        If row Mod 100 = 0 Then
            DoEvents  ' ← 他イベント処理(Ctrl+Breakも受け付ける)
            Application.StatusBar = row & "行目を処理中..."  ' ステータスバー更新
        End If

        row = row + 1
    Loop

    Application.ScreenUpdating = True
    Application.StatusBar = False  ' ステータスバーをリセット
    MsgBox "処理完了(" & (row - 2) & "行)", vbInformation
End Sub

09 For Nextとの使い分けガイド 繰り返し回数が決まっているか否かを軸にした選択フロー

VBAを書いていると「この処理はFor Nextで書くべきか、Do While Loopで書くべきか」と迷う場面があります。基本的な判断基準は「繰り返し回数が事前に確定しているかどうか」です。

ループ構文の選択
繰り返し回数が
事前に決まっている?
Yes → For Next
固定回数・配列全要素
No → Do While Loop
データ末尾まで・条件充足まで
使用場面推奨構文理由
配列の全要素を処理するFor Next(またはFor Each)配列のインデックス範囲が確定しているため
10回固定で繰り返すFor Next繰り返し回数が明確なためForが直感的
シートのデータ末尾まで処理Do While Loopデータ件数が変動するため条件付きループが適切
ユーザーが正しい入力をするまでDo Loop While少なくとも1回は入力を求める後判定が自然
特定の値を見つけるまで検索Do While Loop + Exit DoExit Doで発見時に即座に抜けられるため
ファイルが存在するまで待機Do While Loopファイル存在確認は条件式として表現しやすい
コレクションの全要素を処理For Each Nextコレクション専用の構文が最もシンプル
代表菅澤 代表菅澤
迷ったらDo While Loopを選ぶのが現代VBAの指針です。For Nextに書けるものをあえてDo While Loopで書いても問題ありませんが、逆(Do While Loopで書けるものをFor Nextで無理やり書く)は複雑になりがちです。コードレビューで「繰り返し回数が決まっているのにDo While?」と指摘されたらFor Nextへの書き換えを検討します。

📚 用語解説

For Each Next文:VBAのコレクション(WorksheetsコレクションやRangeオブジェクトなど)の全要素を処理するためのループ構文。「For Each 要素変数 In コレクション ~ Next 要素変数」の形で記述します。コレクションの件数を事前に取得する必要がなく、直感的に書けます。シートを全部処理したい・セルの範囲を全部スキャンしたいといった場面で最もシンプルに記述できます。

' For NextとDo While Loopの使い分け比較
Sub ForVsDoWhileComparison()

    ' ===== 繰り返し回数固定 → For Nextが適切 =====
    ' 5回繰り返してA1:A5にシリアル番号を入れる
    Dim i As Integer
    For i = 1 To 5
        Cells(i, 1).Value = i
    Next i

    ' ===== 件数不定のデータ処理 → Do While Loopが適切 =====
    ' B列のデータがある行を全処理(件数は毎回変わる)
    Dim row As Long
    row = 1
    Do While Cells(row, 2).Value <> ""
        Cells(row, 3).Value = Cells(row, 2).Value * 2
        row = row + 1
    Loop

    ' ===== コレクション全要素 → For Each Nextが最もシンプル =====
    ' 全シートに処理日を記録
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Sheets
        ws.Cells(1, 10).Value = "更新日: " & Format(Now(), "yyyy/mm/dd")
    Next ws

    MsgBox "全処理完了", vbInformation
End Sub
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

10 実務での活用パターン(ファイル処理・API・シート操作) Do While Loopを使った業務マクロの実践コード例

ここでは実務でよく登場するDo While Loopの活用パターンを3つ紹介します。ファイル処理・複数シートの集計・繰り返し検索の3パターンです。

10-1. 複数のExcelファイルを順番に処理するパターン

' 指定フォルダ内のすべてのExcelファイルを処理するパターン
Sub ProcessAllExcelFiles()
    Dim folderPath As String
    folderPath = "C:\Users\kohei\Documents\月次データ\"  ' 処理対象フォルダ

    ' フォルダ内の最初のxlsxファイルを取得
    Dim fileName As String
    fileName = Dir(folderPath & "*.xlsx")

    ' ファイルが見つからなくなるまでループ(Do While + Dir)
    Dim processedCount As Long
    processedCount = 0

    Do While fileName <> ""  ' ← Dirが空文字を返したら終了
        Dim fullPath As String
        fullPath = folderPath & fileName

        ' ファイルを開いて処理
        Dim wb As Workbook
        On Error Resume Next
        Set wb = Workbooks.Open(fullPath, ReadOnly:=True)
        On Error GoTo 0

        If Not wb Is Nothing Then
            ' 1シート目のA1の値を取得してイミディエイトウィンドウに出力
            Debug.Print fileName & " -> A1 = " & wb.Sheets(1).Cells(1, 1).Value
            wb.Close False
            processedCount = processedCount + 1
        End If

        ' 次のファイルを取得
        fileName = Dir()  ' ← Dir()を引数なしで呼ぶと次のファイルを返す
    Loop

    MsgBox processedCount & "ファイルを処理しました", vbInformation
End Sub
AI鬼管理山崎 AI鬼管理山崎
Dir()関数と組み合わせたDo While Loopは「フォルダ内の全ファイルを処理する」定番パターンです。最初にDir(パス & "*.xlsx")でファイル一覧の最初の要素を取得し、ループの最後でDir()(引数なし)を呼ぶことで次のファイルを順に取得します。ファイルがなくなると空文字を返すので、それがループ終了条件になります。

10-2. シートデータの重複チェック・整形パターン

' Do While Loopで重複行を検出・マークするパターン
Sub FindDuplicateRows()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("売上明細")

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ' 外側ループ: 比較元の行
    Dim baseRow As Long
    baseRow = 2

    Do While baseRow < lastRow
        Dim compareRow As Long
        compareRow = baseRow + 1

        ' 内側ループ: 比較先の行(Do While Loopのネスト)
        Do While compareRow <= lastRow
            ' A列(顧客コード)とB列(日付)が一致したら重複
            If ws.Cells(baseRow, 1).Value = ws.Cells(compareRow, 1).Value And _
               ws.Cells(baseRow, 2).Value = ws.Cells(compareRow, 2).Value Then
                ' 重複行をE列に記録し、背景を黄色にする
                ws.Cells(compareRow, 5).Value = "重複(" & baseRow & "行目と)"
                ws.Cells(compareRow, 5).Interior.Color = RGB(255, 255, 0)
            End If
            compareRow = compareRow + 1
        Loop

        baseRow = baseRow + 1
    Loop

    MsgBox "重複チェック完了。黄色の行を確認してください。", vbInformation
End Sub

10-3. 外部APIへのリトライ付きアクセスパターン

' Do Loop Whileでリトライ付きAPI呼び出し
Sub ApiCallWithRetry()
    ' ※ Microsoft XML v6.0参照設定が必要
    Dim apiUrl As String
    apiUrl = "https://api.example.com/data"

    Dim maxRetry As Integer
    Dim retryCount As Integer
    Dim isSuccess As Boolean
    maxRetry = 3
    retryCount = 0
    isSuccess = False

    Dim xmlHttp As Object
    Set xmlHttp = CreateObject("MSXML2.XMLHTTP")

    ' 後判定ループ: 少なくとも1回は試行する
    Do
        On Error Resume Next
        xmlHttp.Open "GET", apiUrl, False
        xmlHttp.send

        If Err.Number = 0 And xmlHttp.Status = 200 Then
            ' 成功
            isSuccess = True
            Err.Clear
        Else
            ' 失敗
            retryCount = retryCount + 1
            Err.Clear
            If retryCount < maxRetry Then
                Application.Wait Now + TimeValue("00:00:02")  ' 2秒待機してリトライ
                MsgBox "APIアクセス失敗。リトライ " & retryCount & "/" & maxRetry, vbInformation
            End If
        End If
        On Error GoTo 0

    Loop While Not isSuccess And retryCount < maxRetry  ' 成功 or 上限回数に達したら終了

    If isSuccess Then
        ' レスポンスを処理
        Dim responseText As String
        responseText = xmlHttp.responseText
        MsgBox "API呼び出し成功(" & retryCount + 1 & "回目)", vbInformation
        ' ... レスポンスをパースして処理 ...
    Else
        MsgBox "API呼び出しが" & maxRetry & "回失敗しました。ネットワークを確認してください。", vbCritical
    End If
End Sub
代表菅澤 代表菅澤
リトライ付きAPI呼び出しはDo Loop While(後判定)が自然に書けるパターンの好例です。「少なくとも1回は試行する」「成功するかリトライ上限に達するまで繰り返す」という要件が後判定ループにぴったり当てはまります。isSuccessフラグとretryCountの組み合わせでループ終了条件を明確に制御できます。

よくある質問

Q. While WendとDo While Loopの違いは何ですか?

A. 両方とも前判定ループで、基本的な動作は同じです。最大の違いはExit Do(途中終了)の可否です。While Wendには途中終了の構文がありませんが、Do While LoopはExit Doでいつでもループを抜けられます。また、Do系はUntil条件(条件がFalseの間繰り返す)に切り替えることもできます。新規コードではDo While Loopの使用を推奨します。

Q. Do While LoopとDo Loop Whileの使い分けは?

A. 「最初から条件がFalseの場合にループ本体を実行したいか否か」が判断基準です。Do While Loop(前判定)は条件がFalseなら0回も実行されません。Do Loop While(後判定)は条件に関わらず必ず1回は実行されます。ユーザーへの入力要求(最低1回はダイアログを出す)やリトライ処理(少なくとも1回は試みる)にはDo Loop Whileが自然です。

Q. Exit DoとExit ForはDoループ以外にも使えますか?

A. いいえ。Exit DoはDo系ループ(Do While Loop・Do Loop While・Do Until等)専用です。For Nextを抜けるにはExit Forを使います。While Wendには対応するExit Wendがありません。While Wendを途中終了させるには、GoToでWendの次のラベルに飛ぶ方法しかありませんが、これがWhile WendよりDo WhileLoopを推奨する理由の一つです。

Q. 無限ループになったときの止め方を教えてください。

A. Ctrl+Break(Breakキーがない場合はCtrl+Pause)でVBAマクロを強制停止できます。VBEのツールバーにある「リセット」ボタン(■)でも停止できます。これらで止まらない場合は、タスクマネージャー(Ctrl+Shift+Esc)からMicrosoft Excelを強制終了してください。ただしこの場合、未保存の変更は失われます。Application.EnableCancelKey = xlDisabledの設定がある場合はCtrl+Breakが無効化されているため、事前にコードを確認してください。

Q. For Nextの代わりにDo While Loopで書いてもいいですか?

A. はい、動作上は問題ありません。ただし「繰り返し回数が事前に決まっている処理」はFor Nextの方が意図が明確に伝わります。コードの可読性・保守性を考えると、固定回数や配列の全要素処理にはFor Next・配列やコレクション全体にはFor Each・件数不定の条件付き繰り返しにはDo While Loopと使い分けるのがVBAのベストプラクティスです。

VBAのWhile・Do Whileループ設計を、Claude Codeで効率化

「ループが無限ループになる」「Exit Doをどこに入れればいいか分からない」「Do WhileとFor Nextをいつ使い分ければよいか判断できない」——VBAのループ処理に関する疑問や実装の壁を、Claude Codeを使った業務効率化で解決しませんか。

AI鬼管理山崎 AI鬼管理山崎
ループ条件の設計・安全上限の組み込み・Exit Doによる正しい途中終了設計など、業務マクロのループ処理をより堅牢に書くためのサポートを提供しています。まずは無料相談でお気軽にご相談ください。

NEXT STEP

この記事の内容を、あなたのビジネスで
実践してみませんか?

AI活用を自社で回せるようになりたい方へ

AI鬼管理

Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。

AIAI鬼管理

AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。

会社名を入力してください
業種を選択してください
お名前を入力してください
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年7月19日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。