Do While は「条件が成り立つあいだ、ずっと繰り返す」ループ
For文は「何回繰り返すか」があらかじめ決まっているループでした。
一方 Do While は、
「この条件が True のあいだは、ずっと繰り返してね」
という、“回数ではなく条件で続けるかどうかを決めるループ”です。
人間の言葉にすると、
「まだ〇〇なら、もう一回やる。〇〇じゃなくなったらやめる」
という感じです。
「いつ終わるかは、条件しだい」というのが、Forとの一番大きな違いです。
Do While の基本構文と動き方
いちばん基本の形
よく使う形はこれです。
Do While 条件式
' 繰り返したい処理
Loop
VB流れはこうです。
- まず「条件式」を評価する
- True なら中の処理を実行
- 処理が終わったら、また条件式を評価
- True のあいだは何度も繰り返す
- False になった瞬間にループを抜ける
簡単な例を見てみます。
Sub SampleDoWhileBasic()
Dim i As Long
i = 1
Do While i <= 5
MsgBox i
i = i + 1
Loop
End Sub
VBこのときの流れを、あえて丁寧に追ってみます。
- i = 1
- 条件
i <= 5を評価 → 1 <= 5 → True - MsgBox 1 を表示
- i = i + 1 → i は 2
- 再び条件
i <= 5→ 2 <= 5 → True - MsgBox 2 …
これを i が 6 になるまで繰り返し、
6 <= 5 が False になったところでループ終了です。
ここで重要なのは、
「条件が変わるように、自分で中で値を更新している」
という点です。
これを忘れると“無限ループ”になります。
For と Do While の違いを感覚でつかむ
For は「回数が決まっているとき」
For i = 1 To 5
MsgBox i
Next i
VBこれは「5回だけやる」と最初から決まっています。
開始値・終了値・Step で、回数がはっきりしているループです。
Do While は「いつ終わるか条件しだいのとき」
Do While Range("A1").Value <> ""
' A1 が空になるまで何かする
Loop
VBこういう書き方は、
「A1 が空になる“まで”続けたい」
という、“終わりのタイミングがデータしだい”な場面に向いています。
「何回やるか」ではなく「いつまでやるか」で考えるとき、
Do While のほうが自然に書けます。
Excel らしい実用例:下までデータが続く行をたどる
A列の「最後のデータ行」まで処理する
「A1 から下に向かって、空白になるまで処理したい」
これは Excel VBA でよくあるパターンです。
Sub SampleDoWhileRows()
Dim r As Long
r = 1 ' 1行目からスタート
Do While Range("A" & r).Value <> ""
Range("B" & r).Value = "処理済"
r = r + 1
Loop
End Sub
VB流れを言葉にすると、
- r = 1(1行目)
- A1 が空でないあいだ、ループを続ける
- B1 に「処理済」と書く
- r を 2 にして、A2 を見る
- A2 が空でないなら、また B2 に「処理済」
- どこかの行で Aセルが空になったら、その時点でループ終了
ここでのポイントは、
「どこまでデータがあるか分からない」
「でも“空になるまで”下にたどりたい」
という“終わりがデータしだい”な状況に、Do While がぴったりハマっていることです。
For で書こうとすると、「最終行を先に調べる」などの一手間が必要になりますが、
Do While なら「空になるまで」という条件だけで書けます。
Do While で一番大事なこと:条件が変化するように書く
無限ループの典型パターン
次のコードを見てください。
Sub BadDoWhile()
Dim i As Long
i = 1
Do While i <= 5
MsgBox i
' i = i + 1 を書き忘れた!
Loop
End Sub
VBこれは、実行すると「1」が永遠に出続ける“無限ループ”になります。
理由はシンプルで、
- 条件は
i <= 5 - i は 1 のまま変わらない
- だから、いつまでたっても 1 <= 5 が True のまま
だからです。
Do While を書くときに、
「ループの中で、条件に関わる値を必ず変化させているか?」
を必ずチェックしてください。
条件に関わる変数・セルを意識する
例えば、
Do While Range("A1").Value <> ""
' ここで A1 の値を変えないと、条件は永遠に変わらない
Loop
VBこのように、「A1 が空かどうか」でループしているのに、
中で A1 を空にする処理を書かなければ、やはり無限ループになります。
Do While を書いたら、必ず自分にこう聞いてください。
「この条件が、ループの中で“いつか False に変わるように”なっているか?」
ここが Do While を安全に使うための一番重要なポイントです。
Do While と Do Loop While の違い(上で判定か、下で判定か)
先に条件をチェックする Do While
今まで見てきたのは、これです。
Do While 条件式
' 処理
Loop
VBこれは、「最初に条件をチェックしてから処理する」形です。
条件が最初から False なら、一度も中身は実行されません。
先に一回実行してから条件をチェックする Do Loop While
もう一つ、こういう書き方もあります。
Do
' 処理
Loop While 条件式
VBこれは、
- まず必ず一回、処理を実行
- そのあとで条件をチェック
- True ならもう一回、False なら終了
という流れになります。
「最低でも一回は必ず実行したい」
「そのあと、条件しだいで続けるか決めたい」
というときは、こちらの形が向いています。
簡単な比較例
Sub SampleDoWhileTop()
Dim i As Long
i = 10
Do While i < 5
MsgBox "上判定: " & i
i = i + 1
Loop
End Sub
VBこれは、最初の時点で i < 5 が False なので、一度も実行されません。
Sub SampleDoWhileBottom()
Dim i As Long
i = 10
Do
MsgBox "下判定: " & i
i = i + 1
Loop While i < 5
End Sub
VBこちらは、条件が False でも、最初の一回は必ず実行されます。
そのあとで i < 5 をチェックして、すぐ終わります。
「最初から条件を満たしていないなら、何もしない」
なら上判定(Do While ~ Loop)、
「条件に関係なく、一回は必ずやりたい」
なら下判定(Do ~ Loop While)、
という使い分けです。
まとめ:Do While は「終わりが条件で決まるループ」
Do While の本質は、
「この条件が True のあいだ、ずっと繰り返す」
「False になった瞬間にやめる」
という、とてもシンプルなものです。
押さえておきたいポイントをコンパクトにまとめると、
Do While は「回数」ではなく「条件」で続けるかどうかを決める
条件に関わる値(変数・セル)を、ループの中で必ず変化させる
変化させないと、簡単に無限ループになる
「データが続く限り」「空になるまで」など、“終わりがデータしだい”な処理に向いている
上判定(Do While ~ Loop)と下判定(Do ~ Loop While)を使い分けられる
