【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

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

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