【初心者向け】VBAで無限ループになったときの原因と対処法

この記事で解決できる3つの疑問

A子さん

ループが止まらなくなって焦ったけど、どうすれば止められるの?
無限ループになるのはなぜ?
次から無限ループを防ぐにはどうすればいいの?

結論:原因のほとんどは「条件が変化しない」ことです

VBAの ForDo 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 WhileDo Untilが活躍します。

ただし自由度が高い分、無限ループのリスクも高まる。

まとめ:ループには「変化」と「出口」が必須

無限ループは、決して珍しいトラブルではなく、プログラマー誰もが経験するものです。

大事なのは、それにどう対処するか、そしてどう予防するかということ。

すぐに実践できる3つのルール

ルール1:ループ内では「必ず条件に関わる変数を変化させる」

カウンターの更新を忘れない。i = i + 1の一行があるかないかで、すべてが変わります。

ルール2:条件式は何度も見直す

<」と「<=」の違い、「True」と「False」の意味を確認。

コード完成後も、必ず再確認。

ルール3:複雑なループには「フェイルセーフ」を仕込む

「最大〇〇回」という制限を設けておくだけで、心理的な安全性が桁違いに向上します。

緊急時の対応も覚えておく

それでも無限ループに遭遇したら:

  • 落ち着いて [Esc] キーを押す
  • 反応しなければ [Ctrl] + [Pause/Break]
  • それでもダメならタスクマネージャーで強制終了

焦らず対応すれば、パソコンが壊れることはありません。

無限ループは誰もが経験する関門。でも原因と対策を理解していれば、もう怖くありません。次からは自信を持ってループを書いてくださいね。

関連記事リンク

VBAのループに関する他のトピックや、デバッグテクニックについても、本ブログで詳しく解説しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

かもろぐ屋へようこそ。

Microsoft製品が大好きな現役社内SEです。
本業では、業務改善・運用・トラブル対応・効率化など、いわゆる「社内の困った」を何でも屋のように対応しています。

このブログでは主に、

VBA
Power Apps
AI

について、実体験ベースで発信しています。

特に最近は、AIを使ったアプリ開発やブログ運営の自動化にハマっています。
「AIがあれば簡単に作れる」と思って始めた結果、普通に壊れたり、詰んだり、課金したりしながら泥臭く進めています。

キラキラした成功談というより、

「実際どうだったのか」
「どこで詰まったのか」
「初心者でも本当にできるのか」

を、できるだけリアルに残すタイプのブログです。

なお、絶賛婚活中です。

コメント

コメントする

CAPTCHA


目次