【VBA】DoEvents()関数でマクロの制御を一時的にOSに渡し、システムが他のイベントを処理できるようにする
DoEvents()とは?
VBAのDoEvents()
関数は、現在実行中のマクロの制御を一時的にOSに渡し、システムが他のイベントを処理できるようにするためのものです。
DoEvents()が必要な理由
通常、VBAのマクロが実行されている間、Excelや他のVBAを実行できるアプリケーションのUIはフリーズします。これにより、ユーザーが操作できなくなり、他の処理もブロックされます。DoEvents()
を適切に使用することで、これを防ぐことができます。
基本的な使用例
Sub SampleDoEvents()
Dim i As Long
For i = 1 To 100000
DoEvents ' OSに制御を渡す
Next i
MsgBox "処理が完了しました"
End Sub
このコードでは、ループの各イテレーションごとにDoEvents()
を呼び出し、他の処理を受け付けるようにしています。
長時間ループでの使用例
Sub LongLoopWithDoEvents()
Dim i As Long
For i = 1 To 10000000
If i Mod 10000 = 0 Then DoEvents ' 10000回ごとに制御を渡す
Next i
MsgBox "処理完了"
End Sub
この方法では、頻繁にDoEvents()
を呼ぶのではなく、一定の回数ごとに呼ぶことで処理の効率を向上させています。
DoEvents()とSleep()の比較
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub UseSleep()
Sleep 1000 ' 1秒待機
MsgBox "1秒後に表示"
End Sub
Sleep()
はCPUを停止させて完全に待機状態にしますが、DoEvents()
はシステムに制御を渡しながら処理を続けます。
DoEvents()の注意点と使うべきでないケース
過度に使用するとパフォーマンスが低下するため、大量のループ内で頻繁に呼び出さないように注意が必要です。また、VBAの処理が中断される可能性があるため、クリティカルな処理中には慎重に使用するべきです。