動作確認: 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
i = i + 1の一行がすべてです。これを忘れるとExcelがフリーズします。本ガイドではWhileの全バリエーションと、二度とExcelを固めない方法を示します。
ForではなくWhileを使う理由
For i = 1 To 100は回数が分かっているときのループです。Whileは回数が分からないときのループ——「データが尽きるまで続ける」「ファイルが開くまで再試行する」。何回繰り返すか事前に言えないなら、Whileの出番です。
3つのキーワード(とその選び方)
| 形 | 条件の判定 | 備考 |
|---|---|---|
Do While ... Loop |
各回の前 | 本体は0回のこともある。現代の標準。 |
Do ... Loop While |
各回の後 | 本体は最低1回は実行される。 |
Do Until ... Loop |
前(真になったら止まる) | 「〜まで」と自然に読める。 |
While ... Wend |
各回の前 | 旧式。 動くがMicrosoftはDoを推奨。 |
推奨:
Do While/Do Untilを使いましょう。古いWhile...Wendは互換性のために残っているだけで、Exitが使えず、時代遅れの書き方とされています。
例1 — Do While と Do Until(同じ結果、意図がより明確)
' Do While — 「まだデータがある間」
Do While Cells(i, 1).Value <> ""
' ... i行目を処理
i = i + 1
Loop
' Do Until — 「空白に出会うまで」(こちらが読みやすいことが多い)
Do Until Cells(i, 1).Value = ""
' ... i行目を処理
i = i + 1
Loop
どちらもA列の最初の空白セルで止まります。あなたにとって自然に読める方を選んでください——ロジックは同じです。
例2 — 条件を末尾で判定する
入力を求めてから検証する場合など、本体を最低1回は実行したいことがあります。
Sub 正の数を求める()
Dim n As Double
Do
n = InputBox("正の数を入力してください")
Loop While n <= 0 ' 条件を満たすまで再入力させる
End Sub
判定がLoop Whileの行にあるため、条件が確認される前にInputBoxが必ず一度表示されます。
例3 — While...Wend(旧式、引き継いだコード向け)
Sub 旧式の合計()
Dim total As Double, i As Long
i = 2
While Cells(i, 1).Value <> ""
total = total + Cells(i, 1).Value
i = i + 1
Wend
MsgBox "合計: " & total
End Sub
これはどのExcelでも動きます。ただし新しく書くなら、Exit Doが使えるようDo While ... Loopに書き換えましょう。
例4 — ループを途中で抜ける
Sub 最初の負数を探す()
Dim i As Long
i = 2
Do While Cells(i, 1).Value <> ""
If Cells(i, 1).Value < 0 Then
MsgBox "最初の負数は " & i & " 行目"
Exit Do ' 即座に抜ける
End If
i = i + 1
Loop
End Sub
Exit Doは、探していたものが見つかった瞬間にループから飛び出します——フラグ変数は不要です。(While...Wendにはこれができません。Doを選ぶ主な理由です。)
例5 — 安全カウンタ付きの再試行
実務の自動化は、ときどき失敗するファイル・ネットワーク・他アプリと対話します。恒久的な失敗が無限ループにならないよう、再試行は必ず上限を設けます。
Sub 再試行して開く()
Dim attempts As Long
attempts = 0
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 ' 最大でも5回まで
End Sub
attempts < 5のガードが、「自己回復する」と「永遠に固まる」の分かれ目です。
最大の落とし穴: 無限ループ
Whileループは条件が偽になるまで回ります。本体の中でそれを起こせるものが何もなければ、Excelは固まり「応答なし」になります。
毎回これを防ぐ3つのルール:
- 条件で使う変数をループ内で必ず変える(
i = i + 1、n = n - 1、次のレコードを読む…)。 - その変化が出口に向かうようにする——条件が
< 10を判定するなら、減らすのではなく増やす。 - 外部状態に終了が依存するループには最大回数カウンタを付ける(ファイル・ユーザー入力・API呼び出し)。
いま暴走ループにはまっていますか? Esc または Ctrl + Break でマクロを中断し、条件を直してから再実行してください。
ループカウンタのお守りはもう不要——目的を言葉で伝える
Whileループは、「昨日は動いた」マクロが静かにフリーズしたシートへ変わる場所です。増分の一行を忘れただけで、ブック全体がロックします。ExcelMaster Agent なら、結果を自然な日本語で述べるだけ——「A列をデータの終わりまで1行ずつ整えて、結果をB列に書いて」——Excelを固められない、安全で上限のあるコードを生成します。無料で試す →
関連ガイド
よくある質問
VBAのWhileとDo Whileの違いは?
判定が先頭にある場合、機能はほぼ同じです。実用的な違いは、Do WhileはExit Doで途中脱出でき、推奨される現代の構文であること。While...Wendは旧式で途中脱出できません。
セルが空になるまでループするには?
Do While Cells(i, 1).Value <> ""(またはDo Until Cells(i, 1).Value = "")とし、毎回iを増やします。最初の空白セルで止めます。
VBAのWhileループが止まらないのはなぜ? 条件の変数がループ内で変わっていないか、出口の値から遠ざかっています。増分行を直し、安全網として最大回数カウンタを足してください。
Do WhileとDo Untilのどちらを使う?
より明確に読める方を。Do While 条件は真である間続き、Do Until 条件は真になるまで続きます。相互に置き換え可能です。
