A子さん「For文以外にも繰り返しの書き方があるって聞いたけど、Do While とか Do Until って何が違うの?」
結論:条件が「満たされるまで続ける」のがDo While、「満たされたら抜ける」のがDo Untilです!
「何かの条件を満たすまで繰り返したい」ときに使えるのが、Do While / Do Until 構文です。
終了条件が決まっていない場合や、ユーザーの入力待ちなどに便利です。
VBAで繰り返し処理といえばFor文をすぐに思い浮かべる人が多いですが、実務ではDo While や Do Until の方が活躍する場面は案外たくさんあります。
今回は、このふたつの構文の違いや使い分けについて、具体例を交えながら詳しく解説していきます。
Do While / Do Untilとは?
Excel VBAで繰り返し処理を行う手段のひとつ。
条件を見てから繰り返す or 繰り返してから条件を判断するという違いがあり、柔軟なループが可能です。
For文との決定的な違いは、「何回繰り返すか」をあらかじめ決めずに、「ある条件に達するまで繰り返す」という点にあります。
たとえば、以下のような場面でDo While / Do Until が活躍します。
- ユーザーが「終了」と入力するまで同じ処理を繰り返したい
- Excelのデータを一行ずつ確認して、空白行に当たったら処理を終わりにしたい
- 特定の値に達するまで計算を続ける
- ファイルを検索して、マッチするデータが見つかるまでループを続ける
こうした「いつまで続くか不確定」な場面こそ、Do While / Do Until の出番なのです。
For文は「10回繰り返す」と決めて使う感じですが、Do While / Do Until は「ゴール地点が決まってるけど、何ステップかかるか分からない」という使い方ですね。
基本構文と使い方
◆Do While の基本構文
Do While 条件 ' 条件がTrueの間、繰り返される Loop
Do While は「Whileの条件が成立している限り、ずっとループを回し続ける」という意味合いです。
ループの開始時に条件をチェックするので、最初からその条件が満たされていなければ、ループ内の処理は一度も実行されません。
◆Do Until の基本構文
Do Until 条件 ' 条件がFalseの間、繰り返される Loop
Do Until は「Untilの条件が成立するまで、ループを回し続ける」という意味です。
こちらも開始時に条件をチェックするため、最初から条件が成立していれば、ループ内は実行されずにスキップされます。
【基本のポイント】
Whileは 「条件が成立している間」 繰り返す ⇒ 条件 = Trueのとき実行Untilは 「条件が成立するまで」 繰り返す ⇒ 条件 = Falseのとき実行- どちらもループ開始時に条件をチェックする(前置き条件型)
「成立している間」と「成立するまで」という微妙な日本語の違いが、プログラムでは大きな意味の違いになることがポイントです。
WhileとUntilの違い(早見表)
| 比較項目 | Do While | Do Until |
|---|---|---|
| 繰り返し条件 | 条件がTrueの間続く | 条件がFalseの間続く |
| 感覚 | 「〜の間は」処理を続ける | 「〜になるまで」処理を続ける |
| 終了タイミング | i = 10になったときに終了 | i = 10になったときに終了 |
| 終了の書き方 | Do While i < 10 | Do Until i = 10 |
表を見るとわかる通り、同じゴール地点に達する場合でも、While i < 10 と Until i = 10 という逆の条件式で書く必要があります。
実際に使い分けるには? 具体例で理解を深める
どちらを使うかは、「あなたが何を続けたいか」で判断するのが最も シンプルです。
パターン① データが残っている間、処理を続けたい → Do While
「A列にデータが存在する限り、処理を続けたい」という場合に向いています。
Dim i As Integer i = 1 Do While Cells(i, 1).Value <> "" ' A列にデータがある間は処理を続ける Cells(i, 2).Value = "処理済み" i = i + 1 Loop
このコードでは、A1からA列を下に見ていき、最初の空白セルに到達したら自動的にループが終わります。
実務ではこのパターンが頻出です。ユーザーがExcelに入力したデータを自動処理するときに、ちょうどいいループになるからです。
パターン② ある値に到達するまで処理を続けたい → Do Until
「iが10になるまで処理を続ける」という逆向きの条件式で考えると、Do Until の方が読みやすいことがあります。
Dim i As Integer i = 1 Do Until i = 10 ' i が 10 になるまで処理を続ける MsgBox i i = i + 1 Loop
「i = 10」という「目的地」を直接書くので、コードを読む人にとって「ここでループが終わるんだな」というのが一目瞭然です。
Do While と Do Until は「同じゴール地点でも、条件式の書き方が逆になる」というのが頭をこんがらがせがちですが、「何を見つめているか」で判断すると分かりやすいですよ。
実践例:空白セルに当たるまでループする
最も実務的なシーンを想定した例を、詳しく解説します。
Dim i As Integer i = 1 Do While Cells(i, 1).Value <> "" Cells(i, 2).Value = "データあり" i = i + 1 Loop
このコードは、A列の空白セルに当たるまで処理を繰り返し、B列にメッセージを表示します。
動作の流れを詳しく説明します。
- 1行目:変数 i を 1 で初期化(A1から開始)
- 2行目:A列の i 行目が空白でない限り、ループを続ける
- 3行目:B列のi行目に「データあり」と入力
- 4行目:i をインクリメント(次の行へ)
- 空白行に到達すると、Do While の条件がFalseになり、ループ終了
たとえば、A1〜A5にデータが入っていて、A6が空白だったとします。この場合、ループはA1から A5まで処理して、A6で終わります。
実践例②:指定値が見つかるまでループする
続いて、Do Until を使った例も見てみましょう。
Dim i As Integer i = 1 Do Until Cells(i, 1).Value = "完了" ' A列に「完了」が見つかるまで処理を続ける MsgBox "現在 " & Cells(i, 1).Value & " を処理中" i = i + 1 If i > 100 Then Exit Do ' 安全装置 Loop
このコードは、A列を上から順に見ていき、「完了」という文字列が見つかった時点でループを抜けます。
ここで大事なのは「If i > 100 Then Exit Do」という安全装置です。もし「完了」が見つからないまま永遠にループを回し続けるのを防ぐためです。
無限ループに注意!条件の正しい書き方
Do While / Do Until で最も危険なのが、無限ループです。
こちらの記事をご確認ください。


以下のように、カウンターの増加を忘れるとどうなるか見てみましょう。
Do While Cells(i, 1).Value <> "" Cells(i, 2).Value = "処理中" ' i = i + 1 を忘れるとずっと同じセルを見続ける! Loop
このコードでは、i が増加しないため、常に同じセル(たとえばA1)をチェックし続けます。
A1にデータが入っていれば、条件は永遠にTrue (Do While) のままなので、ループは終わりません。
実行してしまうと、VBAは無限ループに陥り、ExcelもPCも応答しなくなります。
無限ループに気づかないまま放置すると、Excelが強制終了されて、保存していないデータが全部失われます。悲しい……。
✅ 無限ループを防ぐための3つの対策
- ループ内のカウンター更新を忘れずに: Do While / Do Until は条件を自分で管理する必要があります。i の更新漏れは最大の敵です。
- 安全装置(上限チェック)を仕込む: 念のため「100回以上ループしたら終了」という上限を設ける習慣をつけます。
- 条件式を二重に確認する: Do While / Do Until は逆向きの条件式なので、書き間違える可能性があります。実際に走らせる前に、紙に書いて「この条件で本当に終わるか」を確認します。
無限ループに陥った時の脱出方法
もしも実行中に無限ループに気づいた場合、以下の手順で脱出できます。
- キーボードで Ctrl + Pause Break を押す(VBAの実行を停止)
- それでもダメなら、Escキーを連打
- 最終手段として、Excelをタスクマネージャーで強制終了
ただし、強制終了するとデータが失われるので、なるべく「安全装置」で防止することが大事です。
Exit Doとの合わせ技
特定の条件で途中終了させたい場合は、Exit Do を使います。
これはループ内の任意の場所から、即座にループを抜ける命令です。
Do While i < 100 If Cells(i, 1).Value = "終了" Then Exit Do End If i = i + 1 Loop
このコードでは、たとえ i < 100 という条件が成立していても、セルに「終了」という値が見つかった時点で、すぐにループから脱出します。
Exit Do は無限ループ防止の安全装置としても使えます。
Exit Doを使った安全装置の例
Dim i As Integer i = 1 Do While Cells(i, 1).Value <> "" Cells(i, 2).Value = "処理済み" i = i + 1 If i > 10000 Then ' 1万行以上は処理しない MsgBox "処理行数が上限を超過しました" Exit Do End If Loop
実務では、メインのループ条件に加えて、こういった「念のための上限チェック」を組み込むことが重要です。
データ量が予想外に大きかったり、条件式の記述間違いに気づかずに実行したりしても、このExitの安全装置があれば、無限ループを回避できます。
よくあるつまずきポイント
① Do While と Do Until の条件式が逆向き
最も引っかかりやすいのが、この点です。
「ループを i = 10 で終わらせたい」という場合、以下の2通りの書き方が考えられます。
Do While i < 10⇒ i が 10未満の間、ループを続ける → i = 10で終わるDo Until i = 10⇒ i が 10になるまで、ループを続ける → i = 10で終わる
同じゴール地点なのに、条件式が完全に逆になります。
コードを読む際に「あれ、この条件で本当に終わるのか?」と疑問に思ったら、一度紙に書いて「i が 1, 2, 3 …と増えていく中で、この条件はいつFalseになるか」を追跡してみると、霧が晴れますよ。
② ループ開始時に条件を満たしている場合の挙動
Do While と Do Until は、ループの開始時に条件をチェックします。
つまり、もし開始時から条件が満たされていれば、ループ内の処理は一度も実行されません。
Dim i As Integer i = 10 Do While i < 5 ' 最初からFalseなので、ループは実行されない MsgBox "これは表示されない" Loop
期待値が「最低1回は実行されるはず」だった場合、このコードは意外な挙動になります。
「最低1回は実行したい」という場合は、Do ... Loop While (後置き条件型)を使う必要があります。これについては後で詳しく説明します。
③ セルの比較演算子の落とし穴
Excelのセルと値を比較する際、思わぬ失敗があります。
Dim i As Integer i = 1 Do While Cells(i, 1) = "完了" ' 危険! i = i + 1 Loop
このコードの何が問題か、わかりますか?
Cells(i, 1) は Variant 型で返ってくるため、テキストの完全一致が必要です。
セルに「完了」が入っていても、余分なスペースが入っていたり、大文字小文字が異なったりすれば、マッチしません。
より安全な書き方としては、Trim関数で余分なスペースを削除し、UCase関数で大文字に統一する、という対策があります。
Do While UCase(Trim(Cells(i, 1).Value)) = "完了" i = i + 1 Loop
この慎重さが、実務での信頼できるコードを生み出します。
前置き条件型 vs 後置き条件型
ここまで説明してきた Do While / Do Until は、実は「前置き条件型」という種類です。
VBAには、もう一つ「後置き条件型」という書き方もあります。
前置き条件型(これまで説明した書き方)
Do While 条件 ' 処理 Loop
ループ開始時に条件をチェックするため、条件が満たされなければ、ループ内は実行されません。
後置き条件型
Do ' 処理 Loop While 条件
ループの最後に条件をチェックするため、最低1回は必ず実行されます。
実務ではあまり見かけませんが、「最低1回は実行したい」という場面では便利です。
Dim i As Integer i = 10 Do MsgBox "この行は実行される" i = i + 1
Loop While i < 5 ‘ 条件はFalseだが、1回は実行済み
実務での使い分け
理論だけでなく、実際の案件ではどう使い分けるのかを、シーン別に紹介します。
シーン① 既存データの処理:Do While + 空白判定
「Excelに既に入っているデータを処理する」という最も一般的なシーンです。
- ユースケース:顧客リストを読み込んで、各行に計算結果を入力する
- 使うべき構文:
Do While Cells(i, 1) <> "" - 理由:データ量が不確定で、空白で自動判定できるから
シーン② ファイルの検索:Do Until + 目的値判定
「ある条件に合致するデータが見つかったら終了」というシーンです。
- ユースケース:請求書番号を検索して、見つかったら詳細を表示する
- 使うべき構文:
Do Until Cells(i, 1).Value = "目的値" - 理由:「見つかるまで」という逆向き思考で、コードが直感的になるから
シーン③ ユーザー入力待ち:後置き条件型
「ユーザーが『終了』と入力するまで、何度も同じ処理を繰り返す」というシーンです。
- ユースケース:何度も計算し直したいユーザーのために、計算ツールを提供する
- 使うべき構文:
Do ... Loop Until ユーザー入力 - 理由:最低1回は実行されるため、初回の入力要求を確実に表示できるから
For文との使い分け
「Do While / Do Until なのか、それとも For なのか」という選択も、実務では重要です。
For を使うべき場面
- ループ回数が決まっている(例:1〜100まで)
- 開始値から終了値までの規則的な繰り返し
For i = 1 To 100 Cells(i, 1).Value = i * 2 Next i
▼ For文はこちらで詳しく解説しています。


Do While / Do Until を使うべき場面
- ループ回数が不確定(データ量に応じて変わる)
- 「条件に達するまで」という終了条件が明確
Dim i As Integer i = 1 Do While Cells(i, 1).Value <> "" ' 次へ i = i + 1 Loop
実務では、7割は For で、3割は Do While / Do Until という感覚で使うと、バランスが良いです。
まとめ:条件ループならDo While / Do Untilを活用!
Do While と Do Until の違いを、最後もう一度整理します。
- Do While :条件がTrueの間、ループを続ける。「〜の間は」という思考が自然な場面向け。
- Do Until :条件がFalseの間、ループを続ける。「〜になるまで」という思考が自然な場面向け。
終了条件が明確でない繰り返しに向いている
While と Until は条件の「True/False」で繰り返し方が異なる
Exit Do で柔軟なループ制御も可能
無限ループは安全装置(Exit Do)で防ぐ
実務では、データ量が不確定な場面が大多数。Do While / Do Until の習得は、VBA スキルの第二段階です。
Do While / Do Until はFor文よりも奥深いですが、一度マスターすると、実務のコード効率がぐっと上がりますよ。無限ループだけは本当に気をつけてね。
関連記事リンク
無限ループに関しては繰り返し処理を行う上で一番警戒しなければなりません。


慣れないうちはFor文が安定します。




コメント