DoEvents と sleep 関数の違い

スポンサード リンク

このページでは DoEvents と sleep 関数の違いに関して説明します。
VBA プログラミングでループ処理を行う場合に、タイミングや所要時間を調整するのにとても重要な関数となります。しっかりとポイントを押さえておく必要があります。

ループ処理を実行すると、その間ユーザの入力(キーボードやマウス)を受け付けません。それでは途中でループをキャンセルしたい場合やウィンドウが動いた場合の描画処理などが実行されず、困ることになります。よってループ中に DoEvents 処理を入れることによりこれらの処理に応答させるということです。

スポンサード リンク

(注意)分かりやすく簡単に記載しており、一部の環境や分野では記載内容が異なる可能性があります。あくまでも参考程度でお読みください。

比較表

比較は以下の表の通りとなります。

説明DoEventsSleep 10
無し
処理中のユーザの操作への応答応答可能応答不可応答不可
サンプルコードMsgBox "DoEventsの実験"
StartTime = Timer
For i = 0 To 1000
DoEvents
Next

EndingTime = Timer
MsgBox (EndingTime - StartTime) & "秒経過しました。"

Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)

MsgBox "Sleep実験"
StartTime = Timer
For i = 0 To 1000
Sleep 10
Next

EndingTime = Timer
MsgBox (EndingTime - StartTime) & "秒経過しました。"
MsgBox "何もなしの実験"
StartTime = Timer
For i = 0 To 1000

Next

EndingTime = Timer
MsgBox (EndingTime - StartTime) & "秒経過しました。"
結果0.02秒
10秒0秒
どのような場合に使用するか処理中にキーボードやマウス操作を受け入れたり描画させて欲しい。
CPU使用率を抑えたい場合。
速度最優先で他の処理は不要な場合。
備考-Sleep は VBAの機能ではなし。OS のAPIのため別途宣言して使用する必要あり。
-

実験結果を見ると、DoEvents はほとんど wait がかからないようです。Sleep はループ中に処理を行い時間を遅らせるのには十分ですが、ユーザの操作には応答しない欠点があります。Sleep は一定時間処理を停止する関数ですが、VBAには実装されていません。Win32 APIのため、別途 宣言してからコールする必要があります。


関連リンク:
関数(Function) と API の違い

スポンサード リンク







【注意】本ページは著作権で保護されています。内容は何人も補償しません。時間的あるいは金銭的損失等、一切保証しません。

理解しやすく記載されており、一部不正確な記載がある可能性があります。ご自身の責任で参考にしてください。