エクセルVBAで使うコードの備忘録。VBAでプログラムの実行時間を計測するコード。実行時間を計測・比較することにより、どの部分で処理に時間がかかっているのか可視化することが可能です。プログラムの高速化を検討する際にはとても便利な機能です。
Timer関数
プログラムの実行時間を計測するにはTimer関数を使用するのが便利です。Timer関数は午前0時からのTimer関数が呼び出されたタイミングまでの経過時間を秒単位で返します。プログラムの実行前後でTimer関数を呼び出して値を変数に格納しておけば、その差を調べることによりプログラムの実行時間を算出することが可能です。
構文
[呼び出し時間(Single型)] = Timer
下記に、Timer関数を使用して実行時間を計測する最も簡単なサンプルコードを載せておきます。ただ、このコードだと厳密に言えばいくつか問題が発生する可能性があります。その問題を回避するための方法については後述しますが、とりあえず手っ取り早く実行時間を測定したい場合には下記のサンプルコードで十分です。
サンプルコード
Public Sub TestFunction()
'--- 実行開始・終了時点の時間を格納する変数 ---'
Dim startTime as Single
Dim endTime as Single
'--- 処理の開始時間を取得 ---'
startTime = Timer
'--- 実行時間を測定したい処理 ---'
....
'--- 処理の終了時間を取得 ---'
endTime = Timer
'--- 処理に要した時間を変数に格納 ---'
Dim procTime as Single
procTime = endTime - startTime
End Sub
Timer関数のみで実行時間を計測する際の問題点
Timer関数を使用する際は、秒単位での計測になる点と、その日の午前0時からの経過時間を返す点に注意をしなくてはなりません。具体的に言うと、
- 処理が1秒未満で完了してしまう場合には実行時間を測定することはできない
- 処理に1日以上かかる場合はTimer関数だけではうまく経過時間を取得できない
- 処理が午前0時をまたいで行われる場合は経過時間を取得できない
という問題点が挙げられます。一つ目の問題はそもそも計測する必要がない気がしますが、こちらについてはForループなどを使って同じ処理を大量に(例えば10000回とか)繰り返し、その処理にかかった時間をループ回数で割ることにより疑似的に算出することができます。
1秒未満の実行時間計測
Public Sub TestFunction()
'--- 実行開始・終了時点の時間を格納する変数 ---'
Dim startTime as Single
Dim endTime as Single
'--- 処理の開始時間を取得 ---'
startTime = Timer
'--- 同じ処理を10000回繰り返す ---'
Dim i as Long
Dim n as Long
n = 10000
For i=1 to n
'--- 実行時間を測定したい処理 ---'
....
Next i
'--- 処理の終了時間を取得 ---'
endTime = Timer
'--- 処理に要した時間を変数に格納 ---'
Dim procTime as Single
procTime = (endTime - startTime) / n
End Sub
2つ目と3つ目の問題は、計測開始時点の日付を取得することで計測が可能になります。何年何月何日の午前0時からの経過時間を測定しているのかを取得することにより、処理にかかった時間を算出します。下記のサンプルコードでは、実行時点での日付を取得するためにDate関数を使用しています。
1日以上・午前0時をまたぐ処理に対応する実行時間計測
Public Sub TestFunction()
'--- 実行開始・終了時点の時間と日付を格納する変数 ---'
Dim startTime as Single
Dim startDate as Date
Dim endTime as Single
Dim endDate as Date
'--- 処理の開始時間・日付を取得 ---'
startTime = Timer
startDate = Date
'--- 実行時間を測定したい処理 ---'
....
'--- 処理の終了時間を取得 ---'
endTime = Timer
endDate = Date
'--- 処理に要した時間を変数に格納 ---'
Dim procTime as Single
If (startDate = endDate) then
procTime = endTime - startTime
Else
procTime = (endDate - startDate) * (24 * 60 * 60) + (endTime - startTime)
End If
End Sub