こんにちは!ぐーです。
いつもブログをご覧いただき、ありがとうございます!
「ループ処理」を実装する際、「もし止まらなくなったらどうしよう…」と不安になったことはありませんか?
私も新人の頃、Excelを無限ループで固まらせてしまい、強制終了してデータを飛ばした時の絶望感は今でも忘れられません。
今回は、「WhileとUntilの使い分け」と、「無限ループ回避術」について解説します。
この記事が解決する悩み
- Do While と Do Until、どっちを使えばいいかわからない。
- 無限ループ(処理が止まらない状態)が怖くて実行ボタンが押せない。
- Excel作業でよくある「最終行まで繰り返す」処理を安全に書きたい。
「~の間」か「~になるまで」か。ただそれだけ
結論から言います。この2つは「日本語の感覚」で選んでOKです。
- Do While: 条件が合っている間だけやる。(入場券を持っている間は遊べる)
- Do Until: 条件になるまでやる。(お腹いっぱいになるまで食べる)
事務仕事で例えるとこうなります。
- While: 「データが入っている間、請求書を作り続ける」
- Until: 「空欄になるまで、請求書を作り続ける」
結果は同じですが、人間が読んで「しっくりくる方」を使うのが正解です。
個人的には、「データがある間(While)」の方が、条件が直感的でミスが少ないと感じます。
コピペで使える!安全なループ処理リスト
では、実際のコードを見てみましょう。
ここでは、A列にデータがある限りB列に「処理済」と入力するコードを書きます。
1. Do While(基本の型)
「A列が空欄じゃない(<> “”)間、繰り返す」という書き方です。
Sub SafeLoop_While()
Dim i As Long
i = 2 ' 2行目からスタート
' A列の値が空欄「ではない」間、繰り返す
Do While Cells(i, 1).Value <> ""
' B列に書き込み
Cells(i, 2).Value = "処理済"
' 【重要】次の行へ移動(これがないと無限ループ!)
i = i + 1
Loop
MsgBox "完了しました!"
End Sub
2. Do Until(終わる条件を指定)
「A列が空欄(= “”)になるまで、繰り返す」という書き方です。
Sub SafeLoop_Until()
Dim i As Long
i = 2 ' 2行目からスタート
' A列の値が空欄「になる」まで繰り返す
Do Until Cells(i, 1).Value = ""
' B列に書き込み
Cells(i, 2).Value = "処理済"
' 【重要】次の行へ移動
i = i + 1
Loop
MsgBox "完了しました!"
End Sub
恐怖の「無限ループ」を回避する方法
私たちがコードを書く際、一番恐れるのが無限ループです。
原因の9割は、上記のコードにある i = i + 1(次の行へ進む処理)の書き忘れです。気づかぬうちにずっと同じ行を見続けてしまうんですよね。
万が一、ミスをしてしまってもPCを強制終了させなくて済むコードがあります。
それが DoEvents です。
救済措置付きコード
これをループの中に1行入れておけば、もし止まらなくなっても、キーボードの [Esc] キー や [Ctrl] + [Break] キー でプログラムを緊急停止できます。
Sub AntiFreeze_Loop()
Dim i As Long
i = 2
Do While Cells(i, 1).Value <> ""
Cells(i, 2).Value = "処理済"
' ↓これを入れておくと、PCが固まらずに操作を受け付けてくれる
DoEvents
' わざと次の行へ行くのを忘れてみる(実験用)
' i = i + 1 を書かないと、2行目で永遠に止まるが…
' DoEventsがあるから [Esc] キーで脱出可能!
' ※実際使う時は i = i + 1 を忘れないでください
Loop
End Sub
まとめ:安全運転でいこう
- While は「~の間やる」、Until は「~までやる」。直感で選んでOK。
- ループ内には必ず i = i + 1 を書く。
- 不安なときは DoEvents を入れて、緊急停止できるようにする。
プログラミングは料理でいうレシピのような手順書です。
一つ一つ着実に実装していきましょう!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を厳選して紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント