🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA Whileループ — Excelを固めずにループする方法

|

Excel VBA Whileループ — Excelを固めずにループする方法

動作確認: Excel 365 v2509 · Excel 2021 · Excel 2019 · 最終確認 2026-06-05

要点 — Whileループは、条件が真である間コードを繰り返します。行数が事前に分からないときに使います。コピーして調整してください。

Sub 空白までループ()
    Dim i As Long
    i = 2                                   ' 2行目から開始
    Do While Cells(i, 1).Value <> ""        ' A列にデータがある間、回る
        Cells(i, 2).Value = Cells(i, 1).Value * 1.1
        i = i + 1                           ' ループを終わらせる一歩
    Loop
End Sub

Excelが固まったという話は、どれも1行の欠落にさかのぼります。なぜかを理解すれば、もう二度と書きません。

核心の考え方: ループは「必ず終わる」という約束であり、それを守るのはあなた

For i = 1 To 100のループは自分で終わります。For文がカウンタを所有しているので、あなたが何もしなくても永遠には回りません。

Whileループはその責任をあなたに渡します。条件がTrueである間ちょうど回り続け、その条件をどう覆すかは知りません。つまりどのWhileループも約束です——「これはいずれ False になる」——そして守るのはあなたです。無限ループは奇妙な事故ではなく、約束を破った瞬間に起きることです。

この捉え方が、そもそもいつWhileループを使うかを教えます。回数が分からないとき——「データが尽きるまで」「ファイルが開くまで」。回数を前もって言えるならForが欲しいのであり、約束を破る余地そのものが消えます。

約束を守るルール: 初期化・判定・前進

正しいWhileループはどれも同じ3つの部分を持ちます。名前を付ければ、無限ループはうっかり書けなくなります。

i = 2                              ' 1. 初期化 — 判定が読む変数をセット
Do While Cells(i, 1).Value <> ""   ' 2. 判定   — 約束: これは False になる
    ' ... 作業 ...
    i = i + 1                      ' 3. 前進   — 変数を出口へ動かす
Loop

無限ループはいつも3番目の故障です。前進が無い、あるいは出口から遠ざかる(判定が値の増加を望むのに減らしている)。「なぜループが止まらないのか」の答えはただ1つ——判定の変数を見つけ、前進がそれを False の方へ押しているか確かめます。

キーワードを選ぶ——同じ約束、より明確な意図

約束を判定 用途
Do While ... Loop 各回の 現代の標準。本体は0回のことも。
Do Until ... Loop (真になったら止まる) 「〜まで」と読め、しばしば明確。
Do ... Loop While 各回の 本体を最低1回は実行したいとき。
While ... Wend 各回の 旧式Exit不可。新規コードでは避ける。

Do While 条件Do Until 条件は同じループの言い方違いです——自然に読める方を。唯一の本当の推奨: While...WendよりDoを。途中で抜けられるのはDoだけです。

' 末尾で判定 — 本体は必ず一度回る(例: 入力させてから検証)
Do
    n = InputBox("正の数を入力してください")
Loop While n <= 0

現実の条件下で約束を守る

終わった瞬間に抜ける——Exit Doはフラグ変数に勝ち、Doを選ぶ理由でもあります:

Do While Cells(i, 1).Value <> ""
    If Cells(i, 1).Value < 0 Then
        MsgBox "最初の負数は " & i & " 行目"
        Exit Do
    End If
    i = i + 1
Loop

出口が外の世界に依存するなら、2つ目の約束を加える: 上限。 ファイル・ネットワーク・他アプリは時々失敗するので、唯一の出口が「成功した」だけの再試行ループは永遠に回りえます:

Dim attempts As Long
Do
    attempts = attempts + 1
    On Error Resume Next
    Workbooks.Open "C:\reports\daily.xlsx"
    On Error GoTo 0
    If Not Workbooks Is Nothing Then Exit Do
Loop While attempts < 5            ' 上限 = 予備の約束

attempts < 5のガードが、「自己回復する」を「固まりえない」に変えます。外部状態を待つループには必ず1つ付けましょう。

約束が破れるとき: 無限ループ

本体の中で条件をFalseにできるものが何もなければ、Excelは「応答なし」になり、約束を破ったことになります。3つの確認が毎回これを防ぎます。

  1. 前進は、判定が読む変数を変えているか?i = i + 1n = n - 1、次のレコードを読む…)
  2. 前進は出口へ向かっているか?(判定が< 10を望むなら増やす、減らさない)
  3. 外部状態のループに最大回数の上限はあるか?

いま暴走ループにはまっていますか? Esc または Ctrl + Break でマクロを中断し、前進を直してから再実行してください。

そもそもループを書くべきでないとき

Whileループは「データの終わりまで処理する」のに適した道具です——しかし、動いていたマクロが静かにフリーズしたブックへ変わる、最も多い経路でもあります。ExcelMaster Agent なら、代わりに目的を述べるだけ——「A列をデータの終わりまで1行ずつ整えて、結果をB列に書いて」——約束をあなたの代わりに守る、上限付きの安全なコードを生成します。無料で試す →

関連ガイド

よくある質問

VBAのWhileループが止まらないのはなぜ? 前進が無いか、向きが逆です。条件の変数を見つけ、本体の中の何かがそれを出口の値へ押しているか確かめてください。安全網として最大回数の上限も足します。

WhileとDo Whileの違いは? ループ先頭での判定なら機能はほぼ同じ。実用的な違いは、Do WhileExit Doで途中脱出でき、推奨される現代の構文であること。While...Wendは旧式で途中脱出できません。

セルが空になるまでループするには? Do While Cells(i, 1).Value <> ""(またはDo Until Cells(i, 1).Value = "")とし、毎回iを増やします。最初の空白セルで止めます。

Do WhileとDo Untilのどちらを使う? より明確に読める方を。Do Whileは真である間続き、Do Untilは真になるまで続きます。相互に置き換え可能です。