【VBA】「PCが固まった…」を撲滅!Do LoopのWhileとUntil、どっちを使うか迷わない“たった1つ”の基準

【業務効率化】VBA
スポンサーリンク

こんにちは!ぐーです。
いつもブログをご覧いただき、ありがとうございます!

「ループ処理」を実装する際、「もし止まらなくなったらどうしよう…」と不安になったことはありませんか?

私も新人の頃、Excelを無限ループで固まらせてしまい、強制終了してデータを飛ばした時の絶望感は今でも忘れられません。

今回は、「WhileとUntilの使い分け」と、「無限ループ回避術」について解説します。

【業務効率化】VBAの記事を見る


この記事が解決する悩み

  • 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の記事を見る


VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を厳選して紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

この記事を書いた人
ぐー

手取り15万円の会社員でも、年間100万円以上の節約・資産管理・スキルアップで新NISAで年間360万円投資し、iDeCoもフル活用しています。日商簿記3級持っています。

このブログでは、私が実践してきた節約術やリアルな資産運用、稼ぐ力を高めるITスキルについて発信しています。

生活を豊かにしたくて、高配当株投資で年間配当金60万円をめざしています。現在は年間配当金25万円以上達成!

ゲーム・漫画・アニメなどが好きです。
一緒に資産形成をがんばりましょう!
よろしくお願いします!

ぐーをフォローする
【業務効率化】VBAITスキル
スポンサーリンク
ぐーをフォローする

コメント

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