Excelでマクロが終了したあと、すぐにExcelが反応しないという話

概要

ExcelでVBAマクロの実行が終わっているのにExcelが反応しなくて困ることがありませんか?

反応しないと言っても、完全にフリーズしているわけではなくてプチフリ状態(数秒〜数十秒固まる)で、しばらく待つとちゃんと反応する状態です。

今回は、マクロ自体は正常終了しているのですが、マクロが終わった後にしばらく待たないとExcelが反応しなくて、キー入力などができない現象を解決したときの話です。


状況

今回のマクロは最初に複数の処理対象ブックを開いて、処理の終わったブックから閉じていくという構造でした。

複数のブックを使うため、わりと実行時間のかかる処理でした。

時間がかかるので実行中は「処理中です」というメッセージを表示していました。そして、マクロの最後で画面表示を切り替えて操作する人に終わったことをお知らせしていました。

しかし、「処理中です」というメッセージが消えて画面が切り替わってもしばらくExcelのキー入力やスクロールなどの操作ができない時間がありました。

結果は正しいし少し待てば操作できるのですが、この状態だと操作している人がいつまで待てばいいのか判りにくいというのが問題でした。


解決方法

解決方法は、ブックを閉じるたびにDoEvents を呼ぶというものです。

myWorkbook.Close
DoEvents


Excelの内部の話なのではっきりした理由はわかりませんが、何かの処理が溜まっていってマクロが終わった後に溜まった処理が動き出す。そして、それが終わるまでExcelが反応しないという感じでした。しかし、DoEventsを呼び出すと処理が溜まらなくなり、マクロが終わった後に固まる現象がなくなるのではないかと思います。

DoEventsは、VBAマクロが突然終了する、動作が不安定になるなどの場合に使うと治るというのは割と知られた話です。しかし、それ以外に今回のようにマクロ自体の動きは正常だけど、マクロが終わった後の動作に問題があるときにも使えるようです。


おまけ

今回のマクロは、高速化のために自動計算の抑制、表示の更新の抑制、イベントの抑制もしていました。

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False    


マクロを終了する前に自動計算に戻します。念のため自動計算に戻した後に再計算が終わるまでDoEvents を呼び続ける処理も入れました。

Application.EnableEvents = True
application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
While Not Application.CalculationState = xlDone
    DoEvents
Wend    


2箇所にDoEventsを入れたのですが、ブックを閉じた後にどこかでDoEventsを呼べばいいだけなら、この最後のDoEventsだけでもいいのではないかと思って調べて見ました。

ブックを閉じた
直後のDoEvents
最後の
DoEvents
マクロ終了後Excelが
固まっている時間
0 秒
2.3秒
0秒
4.6秒〜7.6秒


最後のDoEventsだけでも効果はありました。でも、ブックを閉じた後のDoEventsのほうが明らかに効果がありました。

今回のブックはあまり計算式がありませんでした。もし計算式が多く再計算に時間がかかる場合は違った結果になったかもしれません。