【VBA】DoEvents()関数でマクロの制御を一時的にOSに渡し、システムが他のイベントを処理できるようにする

【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の処理が中断される可能性があるため、クリティカルな処理中には慎重に使用するべきです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です