【VBA】マクロの処理をミリ秒(ms)単位で一時停止する方法 (Sleep API)

目次

はじめに

VBAでマクロを実行する際、「処理が速すぎて、何が起きているか目で追えない」「特定の処理の間に、ほんの少しだけウェイト(待ち時間)を入れたい」といった場面があります。

VBAには Application.Wait という待機命令がありますが、これは秒単位での指定しかできず、より短い時間、例えば0.1秒だけ処理を止めたい、といった精密な制御には不向きです。

このようなミリ秒(1000分の1秒)単位での一時停止を実現するのが、Windows APIの Sleep 関数です。この記事では、Sleep APIを使って、VBAの実行を指定したミリ秒だけ正確に中断する方法を解説します。


ミリ秒単位で一時停止するVBAサンプルコード

Declareステートメントは、モジュールの最上部Sub などのプロシージャよりも前)に記述する必要があります。

このマクロは、B列のセルを0.2秒(200ミリ秒)の間隔で、順番にハイライトしていく簡単なアニメーションのような効果を実装します。

完成コード

'--- モジュールの最上部にAPI関数を宣言 ---

' 64bit/32bit両対応
#If VBA7 Then
    ' 指定したミリ秒だけ実行を中断するAPI関数
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If


' 0.2秒間隔でセルをハイライトしていく
Sub HighlightCellsWithDelay()
    Dim i As Long
    
    For i = 2 To 10
        '--- B列のi行目をハイライト ---
        With Cells(i, "B")
            .Interior.Color = vbYellow
            .Font.Bold = True
        End With
        
        '--- Sleep関数で200ミリ秒(0.2秒)だけ処理を中断 ---
        Sleep 200
        
        '--- ハイライトを元に戻す ---
        With Cells(i, "B")
            .Interior.ColorIndex = xlNone
            .Font.Bold = False
        End With
    Next i
    
    MsgBox "処理が完了しました。"
End Sub

コードの解説

Declare PtrSafe Sub Sleep ...

Windows APIである Sleep 関数をVBAで利用可能にするための宣言です。

  • Lib "kernel32": この関数が、Windowsの基本的な機能が集められた kernel32.dll というライブラリに含まれていることを示します。
  • ByVal dwMilliseconds As Long: Sleep 関数が、中断したい時間をミリ秒単位のLong型の数値として受け取ることを定義しています。

Sleep 200

これが、実際に処理を一時停止させている核心部分です。

  • Sleep: API関数 Sleep を呼び出しています。
  • 200: 引数として 200 を渡すことで、「200ミリ秒間、プログラムの実行を停止しなさい」と命令しています。

この一行を For...Next ループの中に入れることで、ループが一周するごとに0.2秒のウェイトが入り、セルの色が変化する様子を視覚的に追うことができるようになります。


まとめ

今回は、Windows APIの Sleep 関数を使って、マクロの実行をミリ秒単位で精密に一時停止させる方法を解説しました。

  • Sleep APIを宣言し、引数にミリ秒を指定して呼び出す。
  • 1秒 = 1000ミリ秒。

Application.Wait では長すぎる、ほんのわずかな待ち時間を設けたい場合に、Sleep APIは非常に有効です。処理の進行状況をユーザーに視覚的に見せたい場合や、外部システムとの通信で短いウェイトが必要な場合などに、ぜひご活用ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次