【VBA】処理時間を計測(Timer)する方法!コードの高速化と改善に役立つパフォーマンス計測
VBAで作成したツールが「なんだか遅い…」と感じたとき、どの処理にどれくらいの時間がかかっているのかを正しく把握することが改善の第一歩です。VBAでは Timer関数 を使うことで、簡単にプログラムの実行時間を計測(プロファイリング)できます。
1. 考え方:Timer関数で「前後の差分」を計算する
Timer関数は、午前0時からの経過時間を「秒単位(小数付き)」で返す関数です。処理の「開始時」と「終了時」のタイマーの値を記録し、その差算(終了時間 - 開始時間)を求めることで、処理にかかった時間を算出します。
実行時間(秒) = 処理終了時の Timer - 処理開始時の Timer
2. 実践サンプル:1,000万回のループ時間を計測する
ポイント:開始時の Timer を変数に記録しておく
以下の例では、1,000万回のForループにかかる時間を計測して、イミディエイトウィンドウに出力します。
Dim l As Long
Dim startTime As Single ' タイマー値保持用の変数
' 計測開始
startTime = Timer
' 計測したい処理(10,000,000回のループ)
For l = 1 To 10000000
l = l + 1
Next l
' 差分を出力(実行時間)
Debug.Print Timer - startTime & " 秒"
End Sub
3. 実行結果
PCのスペックによりますが、ループにかかった時間が秒(小数付き)で出力されます。
4. エンジニアの視点:より正確な計測とボトルネック特定
1. 深夜跨ぎの注意点(日付の壁): Timer関数は午前0時で `0` にリセットされるため、深夜23:59〜0:01のように日付を跨いで計測すると計算結果がマイナスになります。厳密に計測したい場合は、マイナスになったら `+ 86400`(1日の秒数)を補完するロジックを入れると堅牢です。
2. ミリ秒・マイクロ秒単位の計測: `Timer` 関数の精度(約1/64秒)を超える超高速な処理を計測したい場合は、Windows APIの `GetTickCount` や `QueryPerformanceCounter` を使うのがプロエンジニアの「いけいけ」な手法です。
3. 高速化の第一歩: `Application.ScreenUpdating = False`(画面更新停止)や `Application.Calculation = xlCalculationManual`(自動計算停止)を入れる前と後で `Timer` を使って比較してみてください。目に見えて秒数が縮まる快感を味わえます!
5. まとめ
「遅いコード」を改善するには、まず「どれくらい遅いのか」を客観的に測ることが重要です。`Timer` を使った処理時間の見える化を癖にして、ユーザーを待たせない爆速マクロを作り上げていきましょう!