この記事で解決できる3つの疑問
A子さんループが止まらなくなって焦ったけど、どうすれば止められるの?
無限ループになるのはなぜ?
次から無限ループを防ぐにはどうすればいいの?
結論:原因のほとんどは「条件が変化しない」ことです
VBAの For や Do While などの繰り返し処理で、ループが終わらない=無限ループになってしまうことは初心者にありがちなトラブルです。
多くの場合、「ループが終了する条件がずっと満たされない」または「カウンタが変化していない」ことが原因。
でも安心してください。対処法を知っていれば、焦る必要はありません。
無限ループになったときの緊急停止方法
実際に無限ループに陥ったとき。
Excelの画面が反応しなくなり、パソコン全体が止まったように見えるかもしれません。
そういう時は落ち着いて、以下のいずれかの方法を試してください。
【最も簡単】Esc キーで中断する
キーボードの [Esc] キーを押すだけで、処理中のマクロが中断されます。
これがVBAの無限ループを止めるもっとも基本的で効果的な方法。



実務では本当によくお世話になります。焦らずポンと押すだけで大丈夫。
【代替案】Ctrl + Pause/Break で中断
[Esc]キーが反応しない環境もあります。
そういう時は [Ctrl] + [Pause/Break] の組み合わせで中断可能。
ノートパソコンの場合、[Fn]キーを一緒に押す必要があるモデルもあります。
【最終手段】タスクマネージャーで強制終了
それでも止まらない時は、パソコン本体を強制的に操作します。
[Ctrl] + [Shift] + [Esc]でタスクマネージャーを起動。
リストからExcelを選んで「タスクの終了」をクリック。



ただしこの方法だと、保存されていない変更内容が全部消えてしまいます。だからこそ、[Esc]キーで素早く対応することが大切。
なぜ無限ループになるのか?よくある原因3つ
無限ループが発生する理由は、突き詰めると「ループを抜け出す条件が成立しない」ということです。
具体的には、いくつかの典型的なパターンがあります。
原因1:カウンターが変化していない
これが最も多い原因。
ループの終了を判定するカウンター変数が、ループ内で更新されていないケースです。
Dim i As Integer
i = 1
Do While i <= 5
MsgBox i
' i = i + 1 がないため、iはずっと1のまま
Loop
このコードでは、iが1のまま変わりません。
「i <= 5」という条件が永遠に真になり続けるわけです。
結果としてMsgBoxが無限に繰り返される。



初心者の時代、私もこれで何度焦ったことか…。i = i + 1の行を書き忘れるのは本当によくあります。
原因2:条件がいつまでも真(True)のまま
条件式自体は変わらないけれど、その条件を評価するフラグや変数が更新されないパターン。
Dim flg As Boolean
flg = True
Do While flg
MsgBox "止まらない…"
Loop
このコードでは、flgが途中でFalseに変わる処理がありません。
つまり「Do While flg」は永遠に真のまま。
ループは延々と続きます。
原因3:条件式の書き間違い
「<」と「<=」を間違えるなど、条件式のロジックミスもあります。
Dim i As Integer
i = 1
Do While i <> 5 ' 「<>」は「等しくない」という意味
i = i + 1
Loop
一見すると正常そうに見えます。iは1から始まり、毎ループ1ずつ増えます。
でも「i <> 5」というのは「iが5ではない限り続ける」という意味。
iが6、7、8……と増え続け、永遠にループが終わりません。



こういうロジックミスは見た目では気づきにくい。デバッグモードでステップ実行しながらiの値を監視すると一発です。
無限ループを防ぐための正しい書き方
無限ループを起こさないためには、コード設計の段階から意識を高める必要があります。
いくつかのテクニックを組み合わせることで、安全性が大幅に向上します。
テクニック1:ループ条件の変化を明示する
ループの中でループ条件に関わる変数を必ず更新する。
これが基本中の基本。
Dim i As Integer
i = 1
Do While i <= 5
MsgBox i
i = i + 1 ' ← ここが重要。iを必ず更新する
Loop
この形なら、iは1から5まで数えられ、6になった時点でループを抜けます。
「必ず更新される」という安全性が保証される書き方。
テクニック2:条件式を何度も見直す
「<」「<=」「<>」などの条件式は、思った以上に間違えやすい。
コード完成後、絶対に条件式を見直すクセをつけましょう。
具体的な手順:
- ループの開始値と終了値を明確にする
- 条件式が「どこからどこまで」を意図しているか、文章で説明できるか確認する
- 境界値(開始値と終了値)をチェックする
「i が5未満の間続ける」なら <、「5以下の間」なら <=。
この区別を意識的に何度も確認する。
テクニック3:For ループの活用も検討する
シンプルなカウンターループであれば、Forループを使う方が安全。
Dim i As Integer
For i = 1 To 5
MsgBox i
Next i
Forループは、自動的にカウンターを増やしてくれます。
「変数を手動で更新する」という手間が不要になるため、ヒューマンエラーが減ります。
起点と終点が決まっているなら、迷わずForを選ぶべき。
それでも不安なら:フェイルセーフ機構を組み込む
完璧なロジック設計をしたつもりでも、複雑なループになると予測不能な動作が起きることもあります。
そういう時のために「フェイルセーフ」という考え方があります。
つまり、無限ループが発生した際の「保険」を仕掛けておくということ。
フェイルセーフの実装方法:回数制限
ループが一定回数以上回ったら、強制的に抜け出すという仕組みです。
Dim i As Integer
i = 1
Dim count As Integer
count = 0
Do While i <= 5
MsgBox i
i = i + 1
count = count + 1
If count > 1000 Then ' 1000回以上回ったら強制停止
MsgBox "安全のため処理を中断しました"
Exit Do
End If
Loop
この例では、ループカウントcountが1000を超えたら、Exit Doで強制的にループを抜けます。
正常系ならiが5になった時点で抜けるはずですが、もし何か予期しない問題が起きても、最大1000回で必ず止まる。
こういう「最後の砦」があると、本当に安心です。
フェイルセーフの回数をどう設定するか
「1000回」という数字は一例。実務では処理の内容に合わせて調整します。
大量のセル操作をするマクロなら1万回でいいかもしれません。
単純な文字列処理なら100回でも十分。
目安は「正常な処理なら絶対超えない回数+余裕」くらいで考えるといい。



複雑な処理は、設計段階で「このループは最大何回回るはずか」を明確にしておくと、フェイルセーフの回数設定もやりやすいです。
実務でのよくあるつまずきポイント
ポイント1:ネストしたループの無限ループは見つけにくい
ループの中にさらにループがある「ネストしたループ」の場合。
内側のループが無限化していても、外側のループが走っていると全体が反応していないように見えます。
Dim i As Integer
Dim j As Integer
For i = 1 To 3
For j = 1 To 5
' jを更新し忘れたら、ここで無限ループ
Next j
Next i
こういう時はVBAエディタの「デバッグ」メニューから「ステップ実行」を使って、どこでループが止まっているのか特定しましょう。
ポイント2:条件式に文字列比較が含まれるときは要注意
数値の比較なら<や<=の意味は明確。
しかし文字列を条件にすると、「大文字と小文字の区別」や「スペースの有無」で予期しない結果になることがあります。
Dim msg As String
msg = "yes"
Do While msg <> "YES"
msg = "yes"
' msgが"yes"なのに、条件は"YES"を期待している
' 大文字小文字が一致しないため無限ループ
Loop
こういう時は、比較前にUCase()やLCase()で大文字小文字を統一するとセーフ。
ポイント3:外部データ(Excelセルなど)をループ条件にする場合
シートのセル値を条件にしている場合、マクロ実行中に人間がそのセルを編集すると、予期しない動作が起きます。
マクロ実行中は、条件となるセルを触らないようにチームで徹底するか、セル値をあらかじめ変数に格納してから使うようにしましょう。
デバッグ時に活用できる小技
技1:即席でMsgBoxを仕込んでカウンターの値を確認
Dim i As Integer
i = 1
Do While i <= 5
MsgBox "i = " & i ' ここでiの値を確認
' i = i + 1 を書き忘れている
Loop
カウンターが変化しているかどうかを、実行時に目で確認できます。
本来なら5回で終わるはずなのに、ずっと「i = 1」と表示され続けたら、更新処理が抜けていることが分かります。
技2:ステップ実行で1行ずつ追跡
VBAエディタで、ループの開始直前にブレークポイントを設定。
F10キーで1行ずつ実行しながら、変数ウィンドウで値を監視する方法。
少し手間ですが、複雑なロジックの問題を一発で特定できます。



最初はMsgBoxで十分。ただし本番環境では必ず削除してください。ユーザーに「なぜこのダイアログが出るの?」と聞かれます。
Do While と For の使い分けガイド
「どんな時にDo Whileを使い、どんな時にForを使うか」という選択も、無限ループを防ぐ上で重要。
For ループを使うべき場合
- ループの回数が事前に決まっている
- 1から10まで、というように「起点と終点」が明確
- シンプルなカウンターループ
Forループはカウンター更新が自動化されるため、手動で更新忘れするリスクがない。
Do While / Do Until を使うべき場合
- ループの終了条件が「ユーザー操作」や「データの状態」に依存する
- 「〇〇が見つかるまで」というように、事前に回数が不明
- 複雑な条件判定が必要
こういった「動的な終了条件」が必要な場合に、Do WhileやDo Untilが活躍します。
ただし自由度が高い分、無限ループのリスクも高まる。
まとめ:ループには「変化」と「出口」が必須
無限ループは、決して珍しいトラブルではなく、プログラマー誰もが経験するものです。
大事なのは、それにどう対処するか、そしてどう予防するかということ。
すぐに実践できる3つのルール
ルール1:ループ内では「必ず条件に関わる変数を変化させる」
カウンターの更新を忘れない。i = i + 1の一行があるかないかで、すべてが変わります。
ルール2:条件式は何度も見直す
「<」と「<=」の違い、「True」と「False」の意味を確認。
コード完成後も、必ず再確認。
ルール3:複雑なループには「フェイルセーフ」を仕込む
「最大〇〇回」という制限を設けておくだけで、心理的な安全性が桁違いに向上します。
緊急時の対応も覚えておく
それでも無限ループに遭遇したら:
- 落ち着いて [Esc] キーを押す
- 反応しなければ [Ctrl] + [Pause/Break]
- それでもダメならタスクマネージャーで強制終了
焦らず対応すれば、パソコンが壊れることはありません。
無限ループは誰もが経験する関門。でも原因と対策を理解していれば、もう怖くありません。次からは自信を持ってループを書いてくださいね。
関連記事リンク
VBAのループに関する他のトピックや、デバッグテクニックについても、本ブログで詳しく解説しています。





コメント