【ExcelVBA】処理時間を計測する3種類のテンプレートを紹介

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日かかるようになるかもしれません。

必要に応じてリアルタイム表示の記述は消去して頂ければと思います。

スポンサーリンク

最新情報をチェックしよう!
>一緒に学ぶ「Study Satellite」

一緒に学ぶ「Study Satellite」

スタディーサテライトへお越しいただきありがとうございます!
プログラミング・アプリケーション・専門知識の情報を整理しています。
できるだけ分かりやすい記事作成を心がけています
どうぞよろしくお願いいたします。。

CTR IMG