[ホーム] > [間違えやすい類語 IT編一覧] > [DoEvents と sleep 関数の違い]
このページでは DoEvents と sleep 関数の違いに関して説明します。
VBA プログラミングでループ処理を行う場合に、タイミングや所要時間を調整するのにとても重要な関数となります。しっかりとポイントを押さえておく必要があります。
ループ処理を実行すると、その間ユーザの入力(キーボードやマウス)を受け付けません。それでは途中でループをキャンセルしたい場合やウィンドウが動いた場合の描画処理などが実行されず、困ることになります。よってループ中に DoEvents 処理を入れることによりこれらの処理に応答させるということです。
(注意)分かりやすく簡単に記載しており、一部の環境や分野では記載内容が異なる可能性があります。あくまでも参考程度でお読みください。
説明 | DoEvents | Sleep 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 の違い
[ホーム] > [間違えやすい類語 IT編一覧]
,