WaitByDoEvents|DoEventsループで処理を待機する
- yuji fukami
- 3 日前
- 読了時間: 3分

この部品でできること
WaitByDoEvents は、DoEvents をループさせることで、指定したミリ秒だけ処理を待機させるExcel VBAの汎用プロシージャです。
引数に待ち時間(ミリ秒)を渡すだけで、その時間だけ処理を止められる
待機中も画面の再描画やOS・Excelのメッセージ処理が止まらない
Windows APIの宣言が不要。標準モジュールにそのまま貼り付ければ動作する
使いどころ
ボタンを押した瞬間だけ色を変えて、少し待ってから元の色に戻す、といった演出のウェイトに(ChangePushedButtonColorがこの用途で使っています)
処理の合間に短い間を置いて、画面の変化をユーザーに確認させたいとき
Application.Wait や Windows APIの Sleep が使いにくい・不安定な環境でも、確実に動く待機処理が欲しいとき
コード
使い方・引数
引数は1つだけです。
MillSecond(Long)・・・待機したい時間(ミリ秒)。例えば 100 なら0.1秒待ちます
呼び出し例は次のとおりです。
Timer 関数で処理開始時刻を記録しておき、DoEvents を呼びながらループで経過時間をチェックし、指定時間を超えたらループを抜けるだけのシンプルな仕組みです。
依存プロシージャ
このコードは自作の依存プロシージャを持たない、自己完結した部品です。上のコードブロックをそのまま標準モジュールに貼り付ければ動作します。
応用・注意点
VBAで「少しだけ待つ」処理を書く方法はいくつかありますが、WaitByDoEvents ではそれらを使わず、あえて DoEvents のループにしています。
Windows APIの Sleep 関数:Declare 文でAPIを宣言する必要があり、32bit版・64bit版のOfficeで宣言の書き方が変わります。さらにExcel for Macでは同じ形のAPI宣言が使えないため、Windows専用のコードになってしまいます。
Application.Wait:秒未満の細かい待ち時間を指定しにくく、待機中は画面の再描画やイベント処理も止まります。ボタンの色を一瞬変えて見せるような演出では、待機中に画面が固まって見えてしまうと本末転倒です。
DoEvents ループ:Timer と組み合わせるだけなので宣言が不要で、Windows・Mac問わず同じコードで動きます。ループの中で DoEvents を呼ぶことで、待機中もOSやExcelのメッセージ処理(画面の再描画やクリック等のイベント)が止まらずに進みます。
一方で、DoEvents はその性質上、待機中にユーザーが別の操作をすると、そちらのイベントも割り込んで実行されてしまう(再入してしまう)という副作用があります。今回のような「ボタンを押した直後に一瞬だけ色を変える」といった短時間・単純な用途では問題になりにくいですが、待機中に他の処理が割り込んでは困るような重い処理を待たせる用途には向きません。用途に応じて使い分けてください。
まとめ
WaitByDoEvents は、DoEvents をループさせるだけの短いコードで、指定したミリ秒だけ処理を待機できる汎用プロシージャです。Windows APIの Sleep のような環境依存の宣言が不要で、待機中も画面の描画やイベント処理が止まらないのが特徴です。ボタン押下時の色変更演出のような「一瞬だけ待ちたい」場面があれば、そのまま呼び出すだけで使えます。

