【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との使い分けまで、実務で役立つコード例を豊富に交えて説明します。
01 LOOP OVERVIEW 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はすべて「条件付きループ」の仲間です。
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) | ループ末尾で評価 | 後判定・条件が偽の間繰り返す |
02 WHILE WEND 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
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 条件」を「Do While 条件」に、「Wend」を「Loop」に変えるだけです。新規に書くコードではExit Doが使えるDo While Loopを推奨しますが、既存のWhile Wendコードをそのまま使うことも問題ありません。
03 DO WHILE LOOP 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
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
Do While Loopでシートを走査するとき、「最終行はどこか」を事前に知っておくパターンが安全です。ws.Cells(ws.Rows.Count, 1).End(xlUp).Rowは「A列の最後の行から上方向にCtrl+↑した行番号」を返す定番の書き方です。これを使ってDo While row <= lastRowとすれば、データ件数に関係なく安全に走査できます。
04 DO LOOP WHILE 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も無限ループになる可能性があります。特に「Loop While True」と書いてExit Doでしか抜けないパターンは、Exit Doの条件を誤って書くと永遠に終わらなくなります。後判定ループを使うときも「Exit Doが必ず到達できる条件になっているか」を確認してください。また、カウンタを使う場合はDo While Loopと同様にカウンタの更新を忘れないようにしましょう。
05 COMPARISON While WendとDo Whileの違いと使い分け 3種類の条件付きループを状況に応じて選択する判断基準
While Wend・Do While Loop・Do Loop Whileの3種類は、いずれも「条件付きループ」ですが、使い分けのポイントがあります。大きな判断軸は「前判定か後判定か」と「途中終了(Exit Do)が必要か」の2点です。
Yes→後判定
No→前判定
Yes→Do系
No→どちらでもOK
後判定: Do Loop While
前判定+Exit: Do While
前判定シンプル: While Wend
| 判断ポイント | While Wend | Do While Loop | Do Loop While |
|---|---|---|---|
| 判定タイミング | 前判定 | 前判定 | 後判定 |
| 途中終了(Exit) | 不可(GoTo必要) | Exit Do で可能 | Exit Do で可能 |
| 0回の実行 | 条件次第で0回 | 条件次第で0回 | 必ず1回以上実行 |
| Until条件への変換 | 不可 | Do Until Loopに変換可 | Do Loop Untilに変換可 |
| 新規コードでの推奨 | 非推奨(レガシー) | ◎ 推奨 | 条件に応じて使用 |
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 MULTIPLE CONDITIONS 複数条件(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
' 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
07 EXIT DO 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
Do Loopをネスト(入れ子)している場合、Exit Doは最も内側のDo Loopだけを抜けます。外側のDo Loopには影響しません。外側のループも終了させたい場合は、フラグ変数(Boolean型)を使って外側のループの条件にフラグを組み込む設計が必要です。また、For Nextのループから抜けるにはExit Forを使います。Exit DoはFor Nextには使えないので注意してください。
08 INFINITE LOOP 無限ループとデバッグ方法 意図せずマクロが止まらなくなる原因と安全なループ設計
無限ループとは、ループの終了条件が満たされることなく永遠に実行し続ける状態です。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
Application.EnableCancelKey = xlDisabledを設定していると、Ctrl+Breakによる強制停止ができなくなります。デバッグ中にこの設定が残っていると、無限ループから抜け出せなくなります。EnableCancelKeyをxlDisabledに設定するコードは、必ず処理の直前だけに限定し、処理後にxlInterruptWithMessageOrxlErrorHandlerに戻すか、On Errorでリセットするように設計してください。
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 COMPARISON For Nextとの使い分けガイド 繰り返し回数が決まっているか否かを軸にした選択フロー
VBAを書いていると「この処理はFor Nextで書くべきか、Do While Loopで書くべきか」と迷う場面があります。基本的な判断基準は「繰り返し回数が事前に確定しているかどうか」です。
事前に決まっている?
固定回数・配列全要素
データ末尾まで・条件充足まで
| 使用場面 | 推奨構文 | 理由 |
|---|---|---|
| 配列の全要素を処理する | For Next(またはFor Each) | 配列のインデックス範囲が確定しているため |
| 10回固定で繰り返す | For Next | 繰り返し回数が明確なためForが直感的 |
| シートのデータ末尾まで処理 | Do While Loop | データ件数が変動するため条件付きループが適切 |
| ユーザーが正しい入力をするまで | Do Loop While | 少なくとも1回は入力を求める後判定が自然 |
| 特定の値を見つけるまで検索 | Do While Loop + Exit Do | Exit Doで発見時に即座に抜けられるため |
| ファイルが存在するまで待機 | Do While Loop | ファイル存在確認は条件式として表現しやすい |
| コレクションの全要素を処理 | For Each 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
10 PRACTICAL PATTERNS 実務での活用パターン(ファイル処理・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
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
よくある質問
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を使った業務効率化で解決しませんか。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
AI活用を自社で回せるようになりたい方へ
AI鬼管理
Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




