VBAがループで固まったときの対応方法

VBAでループ処理を実行したときに、処理が返ってこずExcelごと固まってしまうことがあります。

その場合の対処方法を書きます。

Ctrl + Breakキー(またはCtrl + Pauseキー)

固まっているVBAの画面を開いて、Ctrl + BreakキーまたはCtrl + Pauseキーを押します。運が良ければ、実行中のコードがデバッグ状態で止まってくれます。

あとはリセットボタン(停止ボタン)を押すなり、処理行を変更したりするなりで適切に処置します。リセットボタンは下の絵の青い四角ボタンですね。表示されていない場合はメニューバーを右クリックして、「標準」を選ぶと出てきます。

処理行を変更する場合は、次に処理を行いたい行で右クリックし、「次のステートメントの設定」を選択します。

ファイル操作などのOpenからCloseまでの一連の操作が必要な処理などは、Closeなどの終了処理に処理行を移して、きちんと停止した方がいいとは思います。と言いながら、私もリセットボタンを容赦なく押したりします。

でも問題になったことはほとんどないです。もし問題があれば再起動しちゃえばいいですしね。

ただ、もしOracleなどの外部データベース等を利用している場合であれば、PCを再起動しても外部データベース等は処理途中の状態が残ったままになることはありますのでそこはご注意ください。

Alt + Tabキー

Ctrl + Breakキーが効かない場合はメッセージボックスなどが裏に隠れていたりすることがあります。

Msgbox関数でなくてもエラーや警告メッセージであることもありますので、エラーダイアログでOKボタンなどを押されるのをVBA側が待っていることもあります。そのため、Atl + Tabキーを押してエラーダイアログを表示させて処理を続行させます。

それでも止まらない場合は次のを。

Ctrl + Breakキー+タスクバーのアプリを色々クリック

上記方法で止まらない場合はこれ。

Ctrl + Breakキーを押しっぱなしでタスクバーのExcelやVBAやその他アプリケーションを次々にクリックします。大抵止まります。

この方法だと結構止まりますが、この方法で止めることが出来たとしても、そのあとのExcelの挙動は不安定になりがちなため、開いているブックを全て閉じてExcelを再起動させた方がいいです。

具体的に何が不安定になるかというと、VBAのブレイクポイントの位置ずれが発生したり、複数のExcelプロセスが起動している場合に他のプロセスのExcelも道連れで異常終了したりと、結構暴れてくれます。個人的にですが、この状態に陥った場合、不安定な状況が嫌いなのでExcelを再起動させます。多くの場合はPC自体も再起動させます。

これでもダメな場合は以下の手順でExcelを強制終了しましょう。

Excelが複数起動しているか確認

タスクバーを右クリックしてタスクマネージャの起動を選択するか、Ctrl + Alt + Deleteキーを押してタスクマネージャの起動を選択します。

プロセスタブを選択して、一覧からEXCEL.EXEを選択します。

VBAはVBA.EXEみたいなものがあるわけではなくExcelの一部のためExcelが対象になります。

ここで、EXCEL.EXEが複数ないか確認しておきます。

「イメージ名」の部分をクリックすると名前で昇順と降順が切り替わりますので、見やすくなります。

複数起動していた場合は、VBAが実行していない方のExcelは固まっていないはずなので、そちらのブックを全て保存して終了します。

Excelを強制終了

Excel自体が固まってしまって、VBAどころかPC作業自体がダメになった、という場合はExcelを強制終了しましょう。

先ほど起動したように再度タスクマネージャを起動し、EXCEL.EXEを選択して「プロセスの終了」ボタンを押して強制終了します。

複数Excelが起動している場合はどのプロセスが固まっているのかがタスクマネージャからは完全には分かりませんので、全てのEXCEL.EXEを終了する方が無難です。

そして、PCも再起動させてしまった方が精神衛生上もいいと思います。