Do Until は「条件が成り立つ“まで”繰り返す」ループ
Do While は「条件が True のあいだ繰り返す」ループでした。
Do Until はその逆で、「条件が True になる“まで”繰り返す」ループです。
人間の言葉にすると、
「まだ〇〇じゃないなら、もう一回やる。〇〇になったらやめる」
という感じです。
「~するまで続ける」という日本語がそのままコードになるイメージを持つと、すっと入ってきます。
Do Until の基本構文と「条件の向き」のイメージ
基本構文
よく使う形はこれです。
Do Until 条件式
' 繰り返したい処理
Loop
VB流れはこうです。
- まず「条件式」を評価する
- 条件式が False のあいだ、処理を繰り返す
- 条件式が True になった瞬間にループを抜ける
ここで大事なのは、
「Do While は“True のあいだ続ける”、Do Until は“True になるまで続ける”」
という“向きの違い”です。
具体例で動きを追う
Sub SampleDoUntilBasic()
Dim i As Long
i = 1
Do Until i > 5
MsgBox i
i = i + 1
Loop
End Sub
VBこのときの流れを丁寧に追ってみます。
- i = 1
- 条件
i > 5を評価 → 1 > 5 は False - 条件が False なので、ループに入る
- MsgBox 1 を表示
- i = 2
- 再び
i > 5→ 2 > 5 は False → ループ続行
…
i が 6 になったとき、6 > 5 は True になるので、その瞬間にループ終了です。
「i > 5 になる“まで”続ける」
という日本語のイメージと、動きがぴったり対応しています。
Do While と Do Until の関係をしっかり整理する
条件をひっくり返すと同じ動きになる
実は、Do While と Do Until は、条件を反転させると同じ動きになります。
Do While i <= 5
' 処理
Loop
VBと
Do Until i > 5
' 処理
Loop
VBは、どちらも「i が 5 以下のあいだ繰り返す」という意味です。
i <= 5 が True のあいだ続ける
とi > 5 が True になる“まで”続ける
なので、結果として同じになります。
ここから分かる大事なポイントは、
「Do While と Do Until は、どちらを使っても書ける。
でも“日本語としてどちらがしっくりくるか”で選ぶと読みやすくなる」
ということです。
日本語にしたときのしっくり感で選ぶ
例えば、
「A1 が空でないあいだ続ける」
なら Do While のほうが自然です。
Do While Range("A1").Value <> ""
' 処理
Loop
VB一方、
「A1 が空になるまで続ける」
と考えたいなら、Do Until のほうがしっくりきます。
Do Until Range("A1").Value = ""
' 処理
Loop
VBどちらも動きはほぼ同じですが、
「自分の頭の中の日本語」とコードを揃えると、バグが減ります。
Excel らしい実用例:空白が出る“まで”下にたどる
A列のデータが続くところまで処理する
「A1 から下に向かって、空白が出る“まで”処理したい」
これは Do Until の典型パターンです。
Sub SampleDoUntilRows()
Dim r As Long
r = 1 ' 1行目からスタート
Do Until 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セルが空になったら、その瞬間にループ終了
「A列が空になるまで」という日本語が、そのまま Do Until Range("A" & r).Value = "" に対応しています。
同じことを Do While で書くとこうです。
Do While Range("A" & r).Value <> ""
' 処理
Loop
VBどちらも正解ですが、
「~になるまで」という発想で考えたいなら Do Until のほうが自然です。
Do Until で一番大事なこと:条件がいつか True になるように書く
無限ループの危険性は Do While と同じ
Do While と同じく、Do Until でも「条件に関わる値が変化しない」と無限ループになります。
Sub BadDoUntil()
Dim i As Long
i = 1
Do Until i > 5
MsgBox i
' i = i + 1 を書き忘れた!
Loop
End Sub
VBこの場合、i はずっと 1 のままなので、i > 5 は永遠に False のまま、ループが終わりません。
Do Until を書いたら、必ず自分にこう聞いてください。
「この条件は、ループの中で“いつか True に変わるように”なっているか?」
Do While のときは「いつか False になるように」でしたが、
Do Until では「いつか True になるように」です。
ここだけ向きが逆になるので、意識しておくと混乱しにくくなります。
条件に関わるものをちゃんと変えているかを見る
例えば、
Do Until Range("A1").Value = ""
' ここで A1 を空にしないと、条件は永遠に False のまま
Loop
VBこのように、「A1 が空になるまで」と書いているのに、
中で A1 を空にする処理を書かなければ、やはり無限ループです。
「条件式の中に出てくる変数・セル」が、
ループの中でちゃんと変化しているかどうかを、必ずチェックしてください。
Do Until と Do Loop Until(下判定)の違い
先に条件をチェックする Do Until
今まで見てきたのは、これです。
Do Until 条件式
' 処理
Loop
VBこれは、「最初に条件をチェックしてから処理する」形です。
条件が最初から True なら、一度も中身は実行されません。
先に一回実行してから条件をチェックする Do Loop Until
もう一つ、こういう書き方もできます。
Do
' 処理
Loop Until 条件式
VBこれは、
- まず必ず一回、処理を実行
- そのあとで条件をチェック
- 条件が False ならもう一回、True なら終了
という流れになります。
「最低でも一回は必ず実行したい」
「そのあと、条件が満たされる“まで”続けたい」
というときは、この形が向いています。
簡単な比較例
Sub SampleDoUntilTop()
Dim i As Long
i = 10
Do Until i < 5
MsgBox "上判定: " & i
i = i - 1
Loop
End Sub
VB最初の時点で i < 5 は False なので、
「i < 5 になるまで」=「i が 4 以下になるまで」繰り返します。
一方で、
Sub SampleDoUntilBottom()
Dim i As Long
i = 10
Do
MsgBox "下判定: " & i
i = i - 1
Loop Until i < 5
End Sub
VBこちらも動きは似ていますが、
「最初の一回は必ず実行される」という点が違います。
「最初から条件を満たしていたら何もしない」なら上判定、
「条件に関係なく一回はやりたい」なら下判定、
という使い分けです。
まとめ:Do Until は「~になるまで」をそのままコードにする道具
Do Until の本質は、
「条件が True になる“まで”繰り返す」
「条件が True になった瞬間にやめる」
という、とてもシンプルなものです。
押さえておきたいポイントをコンパクトにまとめると、
Do While は「True のあいだ続ける」、Do Until は「True になるまで続ける」
条件を反転させれば、Do While と同じ動きにできる
「~になるまで」という日本語で考えたいときは Do Until がしっくりくる
条件に関わる値が、ループの中で“いつか True に変わるように”更新されているかが超重要
上判定(Do Until ~ Loop)と下判定(Do ~ Loop Until)を使い分けられる
