← コード一覧へ戻る
実務Excel・Windows連携

短い待機を入れて待ちループのCPU負荷を抑える

Sleepで短時間だけ処理を休み、DoEventsを挟んでExcelへ操作の機会を返します。

実行前に確認

  • 処理そのものが速くなる例ではありません。Sleep中はExcelの実行スレッドも停止するため、長い待機にはOnTimeを検討してください。
  • DoEventsで他の操作・イベントが動く場合があります。再入防止を入れていますが、業務処理へ入れる際はイベントやブック変更の影響も確認してください。
  • 公式仕様とコードを照合した例です。Excel実機での実行は未検証です。業務ブックではなくコピーで試してください。

1サンプルコード

Option Explicit
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal milliseconds As Long)
Sub PracticeAdvanced8031()
    Static running As Boolean
    Dim i As Long, message As String
    If running Then Exit Sub
    running = True
    On Error GoTo Failed
    For i = 1 To 20
        Sleep 50
        DoEvents
    Next i
    message = "約1秒の待機が終わりました。"
CleanUp:
    running = False
    If Len(message) > 0 Then MsgBox message
    Exit Sub
Failed:
    message = "処理を中止しました: " & Err.Description
    Resume CleanUp
End Sub

図で見る操作の流れ

イメージ図

準備、実行する操作、確認する結果の順で示しています。

  1. 準備

    Windows版VBA7の32/64ビット用です。Sleepの宣言も含めて貼り付けます。50は1回の待機時間(ミリ秒)、20は回数です。

  2. 操作

    Sleepで短時間だけ処理を休み、DoEventsを挟んでExcelへ操作の機会を返します。

  3. 結果

    約1秒後に終了通知が出ます。待ち続けるだけの空ループと比べ、待機中のCPU消費を抑える考え方を確認できます。

処理そのものが速くなる例ではありません。Sleep中はExcelの実行スレッドも停止するため、長い待機にはOnTimeを検討してください。

コードの処理を説明する模式図です。実際の画面や実行結果を撮影したものではありません。

使い方・実行手順を確認する4つの手順で、コードの使い方を確認できます
  1. 1

    Windows版デスクトップExcelの練習用ブックを.xlsmで保存し、Alt+F11→[挿入]→[標準モジュール]へ、この例だけを貼り付けます。

  2. 2

    Windows版VBA7の32/64ビット用です。Sleepの宣言も含めて貼り付けます。50は1回の待機時間(ミリ秒)、20は回数です。

  3. 3

    PracticeAdvanced8031を実行します。無制限のループへ書き換えず、20回のまま試します。

  4. 4

    約1秒後に終了通知が出ます。待ち続けるだけの空ループと比べ、待機中のCPU消費を抑える考え方を確認できます。

使っている機能の公式ドキュメント(Microsoft Learn)