処理中にExcelを操作可能にする

OSに処理を渡すことで、処理中にExcel操作が可能になるDoEvents関数について

'OSに処理を渡す
DoEvents

処理中にOSに処理を渡す関数が「DoEvents」関数です
引数は無く、この関数名のみで使用可能です

関数の解説と使用場面

このコードは単純に処理の中で実行しても何も起きていないように感じる関数です

この関数は、ループ処理で使用します
ループ処理はCPUへの負荷が強く、大量なループ処理や無限ループではExcelが応答なしの状態になり、描画処理も停止するため、いわゆるフリーズしたように見える状態になります

VBAでは処理実行中に「Ctrl+Break」か「Esc」で処理の一時停止させることができます
しかし、処理の内容によってはその操作が効かなくなる場合がありますし、そもそも本当にフリーズしていれば当然停止不能になります

そういった状況を防ぐために使用するのが、この関数です

関数の使用について

この関数をループ処理の内側どこでもいいので入れてあげると、その瞬間だけVBAの処理の為に使用している制御をOS(Windows)に渡しますので、VBAの処理は停止しますがそのタイミングでOSの操作が可能になるためVBEの画面もExcelも操作が可能になります

ただ、上記の停止操作はOSに制御が移っているせいで停止が効きません
ですが、VBEの操作ができるのでループ処理内のどこかでブレイクポイントを設置してあげるとそこで停止します

関数を入れずにループさせた場合、どこかの時点でExcelの描画処理が停止します
その状態でExcelをクリックすると、応答なしの表示がされてしまいフリーズのような画面になります

この関数を使用すると、この描画処理がOS制御でしっかり行ってくれるので描画処理が停止しませんので、VBAが頑張っているところを見せつけられます

ただ、この関数を使用するとOSに制御を渡すため処理時間は大幅に延長してしまいます、まあ別の制御も行ってるんですから当然です

なので、この関数での目的は処理速度ではなく
処理実行中の待ち時間を無駄にしないために使用することになります

また、IE制御などの待機用無限ループでは必須の関数になります

全ての操作が可能になる点について

Excelの操作が可能になるため、アクティブセルを操作するような処理では、動作不良を起こす可能性が非常に高いのでそういった処理で使用する場合であったり、Excel以外の全てのアプリも操作が可能になるため、IE制御であれば制御中のIEを終了されてしまったり、WinAPIでアクティブウィンドウのハンドル値を取得しているのが思惑と違うウィンドウになってしまったり、とさまざまなバグを発生させる可能性があります

ユーザーの為に操作を可能にするのであれば、そういった可能性を考慮した処理作成を行いましょう