Excel VBAで処理時間(実行時間)を計測するテンプレートを作成しました。リアルタイム表示や日をまたいで24時間以上計測したい場合などにも対応できるようにしてみました。ソースコードを公開していますので、コピペや必要に応じてカスタマイズしてご使用頂ければと思います。
スポンサーリンク
簡単に実行時間を計測したい場合
まず、簡単に実行時間を計測したい場合を紹介します。この方法ではプログラム終了時にメッセージで実行時間を表示させることになります。
ソースコードは以下の通りになります。
Sub 時間計測1()
Dim start_time As Double
Dim fin_time As Double
start_time = Timer
'******************ここから処理を記入*******************
'******************ここまで*******************
fin_time = Timer
MsgBox "経過時間:" & fin_time - start_time
End Sub
解説
実行時間を計測するにはTimer関数を使用します。Timer関数はその日の0時からの経過時間を計測するものです。
プログラム開始前のTimer時間とプログラム後のTimer時間の差を計算することで、プログラムの実行時間を計測することができます。
シンプルなコードですが、プログラムの記述が単純で必要最小限のコードなので、全体のプログラムに与える影響もほぼないことがメリットになります。
リアルタイムで時間を表示したい場合
次は計測時間をリアルタイムで表示する方法を紹介します。先ほどの方法だとプログラムを開始してから、どれくらい時間がかかっているか把握することができませんでした。
そこで、エクセル左下のステータスバーに現在までの実行時間を表示させます。
また、計測時間結果も「時間」「分」「秒」で表示させるようにしています。
Sub 時間計測2()
Dim start_time As Double
Dim fin_time As Double
Dim i As Long
start_time = Timer
'******************ここから処理を記入*******************
For i = 1 To 50000
Application.StatusBar = _
"経過時間:" & _
Int((Timer - start_time) / 3600) & "時間" & _
Int((Timer - start_time) / 60) Mod 60 & "分" & _
Int(Timer - start_time) Mod 60 & "秒" & _
Int(100 * ((Timer - start_time) - Int(Timer - start_time)))
DoEvents
Next i
'******************ここまで*******************
fin_time = Timer
MsgBox _
Int((Timer - start_time) / 3600) & "時間" & _
Int((Timer - start_time) / 60) Mod 60 & "分" & _
Int(Timer - start_time) Mod 60 & "秒" & _
Int(100 * ((Timer - start_time) - Int(Timer - start_time)))
End Sub
解説
Application.StatusBar = *******でステータスバーに表示させるメッセージを指定することができます。今回はこの*******の部分に実行時間を表示させるようにしています。
Application.StatusBar = *******が実行されるごとに処理時間が更新されるので、For文やWhile文の中に入れることをお勧めします。
ただし、リアルタイム表示をすることによって、プログラムの実行時間が増えることになります。
プログラムの実行時間を速くしたい場合はApplication.StatusBar = *******の記述回数を少なくすることがポイントになります。
スポンサーリンク
24時間以上または日をまたいで計測したい場合
今まで説明してきた手法だとやや問題がありました。それは、日付を超えて計測する場合や24時間以上計測する場合は、正しく計算できないということです。
理由としてはTimer関数は、その日の経過時間を示すものなので、日付を超えてしまうと経過時間がリセットされてしまうため、正しく計算ができません。
今回はその問題点を解決したものを紹介します。日付をまたいでプログラムの所要時間を計測したい人におすすめです。
Sub 時間計測3()
Dim start_time As Double
Dim now_time As Double
Dim calc_time As Long
Dim start_day As Long
Dim now_day As Long
Dim i As Long
start_day = Now
start_time = Timer
'******************ここから処理を記入*******************
For i = 1 To 50000
now_day = Now
now_time = Timer
calc_time = CLng(now_time - start_time) + (now_day - start_day) * CLng(3600) * CLng(24)
Application.StatusBar = _
"経過時間:" & _
Int(CLng(calc_time) / (CLng(3600) * CLng(24))) & "日" & _
Int((calc_time) / 3600) Mod 24 & "時間" & _
Int((calc_time) / 60) Mod 60 & "分" & _
Int(calc_time) Mod 60 & "秒"
DoEvents
Next i
'******************ここまで*******************
now_day = Now
now_time = Timer
calc_time = CLng(now_time - start_time) + (now_day - start_day) * CLng(3600) * CLng(24)
MsgBox _
Int(CLng(calc_time) / (CLng(3600) * CLng(24))) & "日" & _
Int((calc_time) / 3600) Mod 24 & "時間" & _
Int((calc_time) / 60) Mod 60 & "分" & _
Int(calc_time) Mod 60 & "秒"
End Sub
解説
基本的なプログラムの構造は今までと変わらないのですが、プログラム開始時の日付とプログラム終了後の日付のシリアル値を取得していることがポイントです。
日付の情報から日付をまたいでいるか、数日経過しているかということが判定できます。
もし数日以上プログラムを実行する場合は、リアルタイム表示はしない方が良いかもしれません。
例えば数秒のプログラムであれば5秒が7秒程度になるのは問題ありませんが、規模が大きいプログラムだと処理時間が5日かかるものが7日かかるようになるかもしれません。
必要に応じてリアルタイム表示の記述は消去して頂ければと思います。
スポンサーリンク
コメント