【ExcelVBA】無限ループが起こる原因・対処方法・回避策を徹底解説!!

皆さんは、VBAでループ処理を作るとき、無限ループになってしまったことがありますか?

無限ループになってしまうと、メモリを使いきってExcelが途中で強制終了してデータが消えてしまったり、パソコン自体の操作が遅くなってしまったり、パソコンが固まるときもあります。

そのため、可能な限り無限ループが起こる原因・対策・予防策を知っておくのがおすすめです!

そこで今回は、

・VBAで無限ループが起こる原因とは?

といった基礎的なことから、

・無限ループが起きたときのシンプルな対処方法

・無限ループを起こさないための予防策

といった応用的な方法まで、徹底的に解説します!

VBAで無限ループが起こる原因とは?

まずは、無限ループが起こる原因について解説します。

WhileステートメントにFalseにならない条件を指定してしまったときに、無限ループが起こります。

たとえば、以下のようなケースです。

サンプルコード:

Sub Test()
    Dim i As Integer
    i = 1
    Do While i > 0
        i = i + 1
        Debug.Print i
    Loop
End Sub

Do While文iが0よりも大きい時に、処理をループするループ処理です。

その中で、「i = i + 1」をしてしまっているため、常にループが止まらず無限ループを意図的に起こしています。

こちらは極端な例ですが、条件を満たすケースがない条件を入れてしまい、無限ループになるケースはよくあります。

無限ループになってしまうと、Excelを強制終了するしかないケースが多く、それまで作ったVBAのコードが消えてしまう場合や、Excelのシートで操作した内容もすべて消えてしまう可能性があります。

ちょっとしたミスでそれまでの時間が無駄になってしまうときもあるため、無限ループを起こさないような作りを意識しないといけません。

とはいえ、対処方法がわからなければ、無限ループが起こった時に困ってしまいますよね。

そのため、簡単に対処方法を解説します!

VBAで無限ループが起こった時の対処方法

それでは、無限ループの対処方法について解説します。

対処方法は、大きく分けて以下の3パターンです。


・EscまたはCtrl + Breakキーで処理を強制終了する
・Excelの警告メッセージからファイルを閉じる
・タスクマネージャから直接ファイルを閉じる

いちばん簡単なのが、Escキーまたは、Ctrl + Breakキーを押して処理を強制終了することです。

ループ処理が動いてすぐのときは、メモリもそこまで使っていないため、この方法で処理を止めることができます。

ただ、上記方法で止まらない場合は、途中で出てくる警告メッセージで止めるか、タスクマネージャから直接Excelのアプリを強制終了するかのどちらかになってしまいます。

ただ、この場合、Excelファイルが強制終了してしまうため、途中まで作業したデータが残らなくなってしまいます。

強制終了とExcelのデータを残す方法については以下記事で詳しくまとめているので、詳細を知りたい方は見てみてくださいね!

【ExcelVBA入門】処理が固まってしまった場合に強制終了する方法とは
更新日 : 2018年8月29日

VBAで無限ループを起こさないための予防策とは?

ここまで無限ループが起こる原因・起きたときの簡単な対処方法を解説してきました。

ただ、無限ループがおきなければ、そもそも意識しなくてもいいですよね。

そのため、無限ループを起こさないための予防策を入れながら、開発する癖をつけるのがおすすめです!

予防策1:ループ処理のループ回数上限を事前に設定する

たとえば、Whileステートメント無限ループが起こる可能性があるため、以下のようにif文で必ず上限値を決めておくことで、無限ループを回避することができます。

予防策を入れたコード:

Sub Test1()
    Dim i As Integer
    i = 1
    Do While i > 0
        i = i + 1
        If i > 100 Then
            Exit Do
        End If
        Debug.Print i
    Loop
End Sub

この例では、「Do While i > 0」のような無限ループを起こす条件でも、以下コードを入れていることにより、100回以降は強制的に処理を終了するようにしています。

If i > 100 Then
    Exit Do
End If

このように、条件式とは別に上限値を決めておくのがおすすめです!

予防策2:キャンセルボタン + DoEvents関数を使う

ただ、条件式によっては上限値を決めるのが難しいケースもありますよね?

そんなときは、処理テスト用のユーザーフォーム(画面)を作り、実行ボタンキャンセルボタンを用意するのがおすすめです!

画面例:

上記のような画面の「実行ボタン」を推したときにループ処理を動くようにしてテストし、キャンセルボタンを押したときにDoEvents関数を使ってループ処理中でも必ず処理を終了させる処理を作ることで、強制的に処理を止めることができます。

ユーザーフォームの作り方・DoEvents関数を使ったキャンセル処理の作り方については、以下記事で詳しく解説しているので、気になる方はみてみてくださいね!


【ExcelVBA入門】DoEventsを使って処理を途中で止める方法を徹底解説!
更新日 : 2019年4月16日

まとめ

今回は、VBAで無限ループが起こる原因・対処方法・予防策について解説しました。

無限ループについて理解が深まれば、途中でデータが消えたり作業を止めることなく開発を進めることができます。

ちょっとした意識と対策だけで解決できるので、ぜひ意識してみてくださいね!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。
Webアプリ、業務アプリ開発において、要件定義、設計、インフラ、製造、テスト、運用保守など、様々な経験あり。
また、侍ブログ編集部として、これまでに200記事以上の記事を執筆。
現在はフリーランスエンジニア兼テックライターとして活動中。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説