この記事について
この記事は、生成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へ戻す例を削除。

