【Excel VBA】応答なしを回避する方法【ESC+別アプリ選択かDoEventsがおすすめ】

Excel VBAで応答なしとなってしまった際の対処法についてご紹介します。ESCを押す、ESC+別アプリを選択、DoEvents、タスクマネージャーを使う方法についてご紹介します。ESC+別アプリ選択とDoEventsがおすすめです。
はじめに
訪問ありがとうございます。この記事ではExcel VBAで応答なしを回避する方法についてご紹介します。
ESC、ESC+他アプリ選択、DoEventsを使う方法を説明します。
おすすめなのがESC+他アプリ選択の方法です。
VBAコードで応答なしの原因となる箇所がわかる場合はDoEventsの方法が使えます。
この記事で紹介する内容
- Excel VBAの応答なしを回避する方法
目次
VBAで『応答なし』となる
『応答なし』は無限ループするようなVBAコードや処理に時間がかかるVBAコードを実行した際に発生します。
意図的に無限ループを作ってみます。例えばこのようなVBAコードです。
応答なしとなるVBAコード
Sub TEST1() i = 1 Do While i > 0 Loop End Sub
Do Whileで条件がいつまでも成立してしまって終了しないVBAコードです。
ループの中にi = i + 1とかをうっかり入力し忘れちゃった場合ですね。
こうなるとVBAの画面で『実行中』となって実行が続きます。こんな感じです。

この後に白い画面になります。こんな感じです。

この白い画面になるとVBAの画面もExcelの画面もさわることができず保存もできななくなります。
データを保存していないとそれまでに作成したVBAコードはあきらめることになります。
この白い画面の対策をご紹介します。
ESCでVBAの応答なしを回避
ESCでVBAの応答なしで固まってしまう状態を回避する方法をご紹介します。
やり方は簡単でVBAで無限ループを作ってしまった場合に『ESC』を押す方法です。
白い画面になる前と白い画面になった後で『ESC』を押してみて無限ループを抜けられるか確認してみます。
白い画面になる前
白い画面になる前とはVBAの画面で上の方に『実行中』が表示され続けている状態です。
白い画面になる前の状態

こんな感じで白い画面にはなりませんが、無限ループが発生している状態でずっと実行中になる状態です。
この状態でESCを押してみます。
ESCを押した結果

VBAコードが中断され、なんとか無限ループを抜けることができました。
白い画面になる前にESCを押せれば応答なしを防げそうです。
白い画面になった後
つづいて応答なしと表示された状態から白い画面になった後にESCを押した場合です。
この白い画面の状態でESCを押してみます。
白い画面

ESCを押し続けましたが・・・
私の環境ではまったく変化はなくVBA画面は白い画面のままでした。
応答なしや白い画面になってしまうとESCではVBAの実行を中断することはできなさそうです。
ただ応答なしになる前にESCを押すというのも難しいのでESCの方法はあまり使えなさそうです。
ESC+別アプリ選択でVBAの応答なしを回避
ESC+別アプリ選択の方法をご紹介します。
ESC+別アプリ選択のやり方
方法は簡単で応答なしとなったらESCを押しながら下のバー(タスクバー)の中から適当に別アプリを選択する。という手順です。
ESC+別アプリ選択のやり方

ESCを押しながらこの下のバーのどれでもいいのでアプリを選択します。
やり方はこれだけです。
応答なしや白い画面になった後でやってみます。
応答なしのときやってみる
まずは意図的に無限ループを作って応答なしの状態にしてみます。
応答なしの状態

VBA画面が応答なしとなった後にESC+他アプリ選択をしてみます。
応答なしを解除することができます

VBAの実行が中断できました。
とりあえず私のPC環境では応答なしで固まってしまう状態から抜け出すことができました。
操作も簡単なのでこれはかなり使えますね。
DoEventsでVBAの応答なしを回避
DoEventsを使ってVBAの応答なしを回避する方法を紹介します。
あらかじめ無限ループしそうなVBAコードの中にDoEventsを記載しておくという方法です。
DoEventsの使い方
DoEventsはVBA実行中に他の操作が実行された場合はその操作を割り込ませて実行するというコードです。
DoEventsのイメージはこんな感じです。
DoEventsの使い方

このようにあらかじめDo WhileとLoopの中に『DoEvents』を記載しておきます。
VBAを実行してなかなか終了しないとなった場合でもVBAのリセットボタンなどで終了させることができます。
これでVBAの応答なしを回避することができます。
DoEventsを使った方法でVBAの応答なしを回避してみます。
DoEventsで応答なしを回避
まずは無限ループとなるVBAコードを意図的に作成してその中にDoEventsを記載したコードを作成します。
DoEventsを使ったVBAコード
Sub TEST2() i = 1 Do While i > 0 DoEvents Loop End Sub
Do Whileで条件を満足し続ける無縁ループを作成してその中にDoEventsを記載しています。
DoEventsありで実行
DoEventsを無限ループや処理に時間がかかるコードの中に入れておけば応答なしにはなりません。

VBA画面のリセットボタンが使えますのでリセットボタンで処理を終了してみます。
リセットボタンで処理を終了

これで実行中の処理を止めることができます。
DoEventsを使ってリセット完了

実行中から抜け出すことができました。
ただ、問題点は無限ループが発生しそうなVBAコードを特定してその中にあらかじめDoEventsを記載しておく必要がある点です。
VBAコードの最初や最初に記載するだけではDoEventsは使えませんので使用用途が限られそうです。
タスクマネージャーで強制終了
VBAの応答なしを回避する方法ではありませんが、応答なしで終了もできなくなった際に強制的にVBAとExcelを終了させる方法です。
タスクマネージャーを開いてタスクを終了すれば応答なしのVBAとExcelを強制的に終了できます。
まずはタスクマネージャーを開きます。
タスクマネージャーを開く

下のバーの空いているところで右クリックを押して、『タスクマネージャー』をクリックします。
応答なしのExcelを選択してタスクの終了

応答なしとなっているExcelを選択して、右下の『タスクの終了』をクリックします。
こうすれば応答なしとなっているVBAとExcelを強制的に終了することができます。
応答なしをどうしても中断できない場合の最終手段です。
保存していないデータは残念ながら消えることにはなりますが、とりあえず終了はできます。
おわりに
この記事ではVBAの応答なしを回避する方法について紹介しました。
おすすめなのがESC+他アプリ選択の方法です。作ったVBAが予期せず応答なしになってしまった場合でも実行を高確率で中断することができます(とりあえず私のPC環境ではできました)。
無限ループが発生しそうなVBAコードや時間がかかりそうなコードVBAコードの箇所がわかっている場合はDoEventsを使う方法がおすすめです。
DoEventsをコードの中にあらかじめ記載しておけば確実に無限ループを止めることができます。
どうやっても応答なしが中断できない場合は最終的にはタスクマネージャーでしかたなく強制終了することになるかと思います。
ご参考になればと思います。最後までご覧くださいましてありがとうございました。
関連する記事から探す