はじめに
VBAの Timer
関数は、マクロの処理時間を秒単位で手軽に計測できますが、非常に高速に完了する処理のパフォーマンスを比較したい場合、秒単位では差が分からず、より精密な計測が必要になります。
このような高精度な時間計測には、Windows APIの GetTickCount
関数が最適です。GetTickCount
は、PCが起動してからの経過時間を**ミリ秒(1000分の1秒)**単位で返すため、ごく短時間で終わる処理の速度も正確に計測できます。
この記事では、GetTickCount
APIを使って、マクロの処理時間をミリ秒単位で計測する方法を解説します。
処理時間をミリ秒単位で計測するVBAサンプルコード
Declare
ステートメントは、モジュールの最上部(Sub
などのプロシージャよりも前)に記述する必要があります。
完成コード
'--- モジュールの最上部にAPI関数を宣言 ---
' 64bit/32bit両対応
#If VBA7 Then
' PC起動からの経過時間をミリ秒単位で取得するAPI関数
Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As LongLong
#Else
Private Declare Function GetTickCount Lib "kernel32" () As Long
#End If
' 処理時間をミリ秒(ms)単位で計測する
Sub MeasureTimeInMilliseconds()
Dim startTime As LongLong
Dim endTime As LongLong
Dim elapsedTime As LongLong
'--- 1. 処理前の時刻を記録 ---
startTime = GetTickCount()
'--- 2. 計測対象の処理 ---
' (例: 10万回のループ処理)
Dim i As Long
For i = 1 To 100000
' 何か軽い処理
Next i
'--- 3. 処理後の時刻を記録し、差分を計算 ---
endTime = GetTickCount()
elapsedTime = endTime - startTime
'--- 4. 結果を表示 ---
MsgBox "処理が完了しました。" & vbCrLf & vbCrLf & _
"経過時間: " & elapsedTime & " ミリ秒", vbInformation, "処理時間計測"
End Sub
コードの解説
Declare PtrSafe Function GetTickCount ...
Windows APIである GetTickCount
関数をVBAで利用可能にするための宣言です。
As LongLong
: 64bit環境 (Vba7
) では、GetTickCount
が返す値は非常に大きくなる可能性があるため、より大きな数値を扱えるLongLong
型で受けるのが安全です。32bit環境ではLong
のままで問題ありません。
startTime = GetTickCount()
処理を開始する直前の、PC起動からの経過ミリ秒数を変数 startTime
に格納しています。
elapsedTime = endTime - startTime
処理が終わった直後の経過ミリ秒数 endTime
から、開始前の startTime
を引き算します。その差が、まさしく処理にかかった時間(ミリ秒)となります。
Timer
関数との違い
- 精度:
Timer
は秒単位(小数点以下あり)、GetTickCount
はミリ秒単位(整数)です。短時間の処理ではGetTickCount
の方が圧倒的に高精度です。 - リセット:
Timer
は深夜0時にリセットされますが、GetTickCount
はPCを起動してから約49.7日後にリセット(0に戻る)されます。通常のVBAマクロの計測で問題になることはほぼありません。
まとめ
今回は、Windows APIの GetTickCount
を使って、マクロの処理時間をミリ秒単位で高精度に計測する方法を解説しました。
GetTickCount
APIを宣言する。- 処理の前に
GetTickCount
の値を記録する。 - 処理の後に
GetTickCount
の値を記録する。 - 差分を計算すれば、ミリ秒単位の処理時間になる。
コードのわずかな違いがパフォーマンスにどう影響するかを比較・分析する際など、より厳密な速度計測が必要な場面で、このテクニックは非常に役立ちます。