【VBA】マクロの処理時間をミリ秒(ms)単位で高精度に計測する方法 (GetTickCount API)

目次

はじめに

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 を使って、マクロの処理時間をミリ秒単位で高精度に計測する方法を解説しました。

  1. GetTickCount APIを宣言する。
  2. 処理の前に GetTickCount の値を記録する。
  3. 処理の後に GetTickCount の値を記録する。
  4. 差分を計算すれば、ミリ秒単位の処理時間になる。

コードのわずかな違いがパフォーマンスにどう影響するかを比較・分析する際など、より厳密な速度計測が必要な場面で、このテクニックは非常に役立ちます。

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

この記事を書いた人

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

目次