Excel VBA | 超初心者(Excel操作+マクロ体験):基本文法 - Do Until

Excel VBA VBA
スポンサーリンク

Do Until は「条件が成り立つ“まで”繰り返す」ループ

Do While は「条件が True のあいだ繰り返す」ループでした。
Do Until はその逆で、「条件が True になる“まで”繰り返す」ループです。

人間の言葉にすると、

「まだ〇〇じゃないなら、もう一回やる。〇〇になったらやめる」

という感じです。
「~するまで続ける」という日本語がそのままコードになるイメージを持つと、すっと入ってきます。


Do Until の基本構文と「条件の向き」のイメージ

基本構文

よく使う形はこれです。

Do Until 条件式
    ' 繰り返したい処理
Loop
VB

流れはこうです。

  1. まず「条件式」を評価する
  2. 条件式が False のあいだ、処理を繰り返す
  3. 条件式が 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

このときの流れを丁寧に追ってみます。

  1. i = 1
  2. 条件 i > 5 を評価 → 1 > 5 は False
  3. 条件が False なので、ループに入る
  4. MsgBox 1 を表示
  5. i = 2
  6. 再び 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

流れを言葉にすると、

  1. r = 1(1行目)
  2. A1 が空になる“まで”ループを続ける
  3. B1 に「処理済」と書く
  4. r を 2 にして、A2 を見る
  5. A2 が空でなければ、また B2 に「処理済」
  6. どこかの行で 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

これは、

  1. まず必ず一回、処理を実行
  2. そのあとで条件をチェック
  3. 条件が 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)を使い分けられる

タイトルとURLをコピーしました