【ExcelVBA】日付をまたぐ処理時間の計測

処理時間の計測にはTimer()が便利ですが、日付をまたぐと0にリセットされてしまうので使えません。日付をまたぐときにはNow()を使います。

質問

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14282554634

あるマクロの開始から終了までの時間を秒単位で計測したいです。
そのマクロは数時間掛かるものなので、開始する時刻によっては日を跨いでしまいます。
これを実現するコードを教えてください。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14282554634

回答

Sub 日付をまたぐ処理時間の計測()
    Dim startTime As Variant
    Dim endTime As Variant
    Dim processTime As Variant
    
    startTime = Now

    ' 長~~~~~~~い処理
    
    endTime = Now
    
    processTime = endTime - startTime
'    Debug.Print Format(processTime, "HH:NN:SS")
    Debug.Print Format(processTime, "HH") * 3600 + Format(processTime, "NN") * 60 + Format(processTime, "SS")
End Sub

解説

Nowで現在日時をとってきます。

Nowの型はVariant型です。

Nowでとってきた値を人が目で見て分かるようにするには、Format関数を使います。

Format関数で気をつけないといけない点は、月と分です。どちらもMMと表現している例をよく見かけますが

Format(processTime, “YYYY/MM/DD HH:MM:SS”)

これだとどちらが月でどちらが分か見分けがつきません(VBAは内部で解釈してちゃんと動きますが)。

分にはNNを使って区別する方がよいです。

Format(processTime, “YYYY/MM/DD HH:NN:SS”)

回答にあるコードはNNを使っています。

編集後記

日付をまたぐような長い処理と言うのは、私も経験がありますが、非常にいやなものですね^^;

仕事終わりにセットして、翌日朝出勤してきたときに「終わってるかな~?」と確認すると、終わってなかった、異常終了していた・・・orz なんて経験は何度もあります。

そのため、デバッグの仕掛けはあちこちに仕込んでおいたものです。

Nowの仕込みは基本ですね。あとは件数をログに吐くとか、StatusBarに表示するとか、DoEventsとか・・・。今はもう、こういう現場から退いて久しいのですが、たまに知恵袋で現役で苦しんでる方をお見かけすると、「頑張って!」と応援したくなります。