VBAの処理時間を正しく測る ― Timer・GetTickCount・QueryPerformanceCounterの使い分け

VBA・Officeカテゴリを表すパンダのイラスト VBA・Office

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Windowsの時間計測API仕様を確認し、旧記事の「GetTickCountなら高精度」という単純化と、Excel設定を常に固定値へ戻す実装を見直しました。

検証ステータス:✅ Windows APIの役割を再確認

VBAの高速化では、コードを書き換える前に同じ条件で処理時間を測ることが重要です。用途によって計測方法を使い分けます。

3つの方法

方法 用途
Timer 数秒以上の処理を手軽に比較。日付をまたぐ処理には注意。
GetTickCount Windows起動後の経過時間をミリ秒値で取得。32bit値は約49.7日でwrapする。
QueryPerformanceCounter 短時間のベンチマークなど高分解能の計測。

短い処理はQueryPerformanceCounter

#If VBA7 Then
Private Declare PtrSafe Function QueryPerformanceCounter Lib "kernel32" (ByRef value As Currency) As Long
Private Declare PtrSafe Function QueryPerformanceFrequency Lib "kernel32" (ByRef value As Currency) As Long
#Else
Private Declare Function QueryPerformanceCounter Lib "kernel32" (ByRef value As Currency) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (ByRef value As Currency) As Long
#End If

Private Function ElapsedMs(ByVal startCounter As Currency, ByVal endCounter As Currency, ByVal frequency As Currency) As Double
    ElapsedMs = (endCounter - startCounter) / frequency * 1000#
End Function

Currencyは8バイトの格納領域を持つため、古いVBAでもLARGE_INTEGER値を受ける実装で使われる手法です。開始・終了・周波数を同じ型で扱えば比率を計算できます。

Excel設定は「元の値」を保存して戻す

Calculationを常にAutomaticへ戻すと、元々Manualだった利用者の設定を壊します。ScreenUpdating、EnableEvents、Calculationなどは開始前の値を保存し、finally相当の後処理で元へ戻します。

ベンチマークのコツ

  • 同じデータで複数回測る。
  • 初回だけ遅い処理はウォームアップ後も測る。
  • セルを1個ずつ読む処理と配列一括処理を分けて比較する。
  • 計測対象外の画面描画・ログ出力を混ぜない。

公式情報

この記事の更新履歴

  • 2026-09-14 追加:QueryPerformanceCounterと元設定を復元する考え方を追加。
  • 2026-09-14 変更:GetTickCount一択から、処理時間に応じて計測手段を選ぶ構成へ変更。
  • 2026-09-14 削除:内部style_prompt、本文H1、根拠のない定量効果、常にCalculation=Automaticへ戻す例を削除。

文書情報

記事タイトル
VBAの処理時間を正しく測る ― Timer・GetTickCount・QueryPerformanceCounterの使い分け
作成日
更新日
Source URL
https://papanda925.com/?p=5524

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました