【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とか・・・。今はもう、こういう現場から退いて久しいのですが、たまに知恵袋で現役で苦しんでる方をお見かけすると、「頑張って!」と応援したくなります。
-
前の記事
給与計算業務を受託していない理由 2023.07.06
-
次の記事
Googleマップのルート検索で失敗し(そうになっ)た話 2023.07.10