はじめに
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は非常に有効です。処理の進行状況をユーザーに視覚的に見せたい場合や、外部システムとの通信で短いウェイトが必要な場合などに、ぜひご活用ください。