🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA Whileループ — While・Do While・Do Until(5つの実例)

|

Excel VBA Whileループ — While・Do While・Do Until(5つの実例)

動作確認: Excel 365 v2509 · Excel 2021 · Excel 2019 · 最終確認 2026-06-05

要点 — Whileループは、条件が真である間コードを繰り返します。行数が事前に分からないときに使います。コピーして調整してください。

Sub 空白までループ()
    Dim i As Long
    i = 2                                   ' 2行目から開始
    Do While Cells(i, 1).Value <> ""        ' A列にデータがある間、回る
        Cells(i, 2).Value = Cells(i, 1).Value * 1.1
        i = i + 1                           ' 必ず進めること。さもないと永遠に終わらない
    Loop
End Sub

i = i + 1の一行がすべてです。これを忘れるとExcelがフリーズします。本ガイドではWhileの全バリエーションと、二度とExcelを固めない方法を示します。

ForではなくWhileを使う理由

For i = 1 To 100は回数が分かっているときのループです。Whileは回数が分からないときのループ——「データが尽きるまで続ける」「ファイルが開くまで再試行する」。何回繰り返すか事前に言えないなら、Whileの出番です。

3つのキーワード(とその選び方)

条件の判定 備考
Do While ... Loop 各回の 本体は0回のこともある。現代の標準。
Do ... Loop While 各回の 本体は最低1回は実行される。
Do Until ... Loop (真になったら止まる) 「〜まで」と自然に読める。
While ... Wend 各回の 旧式。 動くがMicrosoftはDoを推奨。

推奨: Do While / Do Until を使いましょう。古いWhile...Wendは互換性のために残っているだけで、Exitが使えず、時代遅れの書き方とされています。

例1 — Do While と Do Until(同じ結果、意図がより明確)

' Do While — 「まだデータがある間」
Do While Cells(i, 1).Value <> ""
    ' ... i行目を処理
    i = i + 1
Loop

' Do Until — 「空白に出会うまで」(こちらが読みやすいことが多い)
Do Until Cells(i, 1).Value = ""
    ' ... i行目を処理
    i = i + 1
Loop

どちらもA列の最初の空白セルで止まります。あなたにとって自然に読める方を選んでください——ロジックは同じです。

例2 — 条件を末尾で判定する

入力を求めてから検証する場合など、本体を最低1回は実行したいことがあります。

Sub 正の数を求める()
    Dim n As Double
    Do
        n = InputBox("正の数を入力してください")
    Loop While n <= 0          ' 条件を満たすまで再入力させる
End Sub

判定がLoop Whileの行にあるため、条件が確認される前にInputBoxが必ず一度表示されます。

例3 — While...Wend(旧式、引き継いだコード向け)

Sub 旧式の合計()
    Dim total As Double, i As Long
    i = 2
    While Cells(i, 1).Value <> ""
        total = total + Cells(i, 1).Value
        i = i + 1
    Wend
    MsgBox "合計: " & total
End Sub

これはどのExcelでも動きます。ただし新しく書くなら、Exit Doが使えるようDo While ... Loopに書き換えましょう。

例4 — ループを途中で抜ける

Sub 最初の負数を探す()
    Dim i As Long
    i = 2
    Do While Cells(i, 1).Value <> ""
        If Cells(i, 1).Value < 0 Then
            MsgBox "最初の負数は " & i & " 行目"
            Exit Do                 ' 即座に抜ける
        End If
        i = i + 1
    Loop
End Sub

Exit Doは、探していたものが見つかった瞬間にループから飛び出します——フラグ変数は不要です。(While...Wendにはこれができません。Doを選ぶ主な理由です。)

例5 — 安全カウンタ付きの再試行

実務の自動化は、ときどき失敗するファイル・ネットワーク・他アプリと対話します。恒久的な失敗が無限ループにならないよう、再試行は必ず上限を設けます。

Sub 再試行して開く()
    Dim attempts As Long
    attempts = 0
    Do
        attempts = attempts + 1
        On Error Resume Next
        Workbooks.Open "C:\reports\daily.xlsx"
        On Error GoTo 0
        If Not Workbooks Is Nothing Then Exit Do
    Loop While attempts < 5         ' 最大でも5回まで
End Sub

attempts < 5のガードが、「自己回復する」と「永遠に固まる」の分かれ目です。

最大の落とし穴: 無限ループ

Whileループは条件が偽になるまで回ります。本体の中でそれを起こせるものが何もなければ、Excelは固まり「応答なし」になります。

毎回これを防ぐ3つのルール:

  1. 条件で使う変数をループ内で必ず変えるi = i + 1n = n - 1、次のレコードを読む…)。
  2. その変化が出口に向かうようにする——条件が< 10を判定するなら、減らすのではなく増やす。
  3. 外部状態に終了が依存するループには最大回数カウンタを付ける(ファイル・ユーザー入力・API呼び出し)。

いま暴走ループにはまっていますか? Esc または Ctrl + Break でマクロを中断し、条件を直してから再実行してください。

ループカウンタのお守りはもう不要——目的を言葉で伝える

Whileループは、「昨日は動いた」マクロが静かにフリーズしたシートへ変わる場所です。増分の一行を忘れただけで、ブック全体がロックします。ExcelMaster Agent なら、結果を自然な日本語で述べるだけ——「A列をデータの終わりまで1行ずつ整えて、結果をB列に書いて」——Excelを固められない、安全で上限のあるコードを生成します。無料で試す →

関連ガイド

よくある質問

VBAのWhileとDo Whileの違いは? 判定が先頭にある場合、機能はほぼ同じです。実用的な違いは、Do WhileExit Doで途中脱出でき、推奨される現代の構文であること。While...Wendは旧式で途中脱出できません。

セルが空になるまでループするには? Do While Cells(i, 1).Value <> ""(またはDo Until Cells(i, 1).Value = "")とし、毎回iを増やします。最初の空白セルで止めます。

VBAのWhileループが止まらないのはなぜ? 条件の変数がループ内で変わっていないか、出口の値から遠ざかっています。増分行を直し、安全網として最大回数カウンタを足してください。

Do WhileとDo Untilのどちらを使う? より明確に読める方を。Do While 条件は真である間続き、Do Until 条件は真になるまで続きます。相互に置き換え可能です。