皆さんは、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のデータを残す方法については以下記事で詳しくまとめているので、詳細を知りたい方は見てみてくださいね!
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関数を使ったキャンセル処理の作り方については、以下記事で詳しく解説しているので、気になる方はみてみてくださいね!
まとめ
今回は、VBAで無限ループが起こる原因・対処方法・予防策について解説しました。
無限ループについて理解が深まれば、途中でデータが消えたり作業を止めることなく開発を進めることができます。
ちょっとした意識と対策だけで解決できるので、ぜひ意識してみてくださいね!