プログラムにて大量の処理を行う場合は、処理の所要時間が気になるところです。
以前、プログレスバーを使って視覚的に進捗状況を伝える処理をご紹介致しました。
今回は、処理時間を計測し、処理終了時に所要時間を表示する方法をご紹介致します。
※今回のサンプルの環境は、Excel2016を使用しています。
考え方
この処理の考え方は至ってシンプルです。
以下の様に考えます。
処理終了時の時間 ー 処理開始時の時間 = 処理の所要時間
以上の事から、「処理の開始時の時間」と「処理の終了時の時間」を処理の中で取得する必要があります。
計測値の持ち方と処理の仕方
①Time関数で開始時間と終了時間の取得して差分を表示する
このパターンでは、Time関数を用いて処理開始の時刻と処理終了の時刻を取得し、その差分を取る形で処理します。
Time関数とは、システム時刻を取得する関数です。
戻り値のデータ型はDateです。
書き方は以下の様になります。
Dim StartTime As Date '処理の開始時刻を格納する変数領域
Dim EndTime As Date '処理の終了時刻を格納する変数領域
StartTime = Time
'-------------------------------------------------------
' 何らかの大量の処理
'-------------------------------------------------------
EndTime = Time
②Timer関数で開始時間と終了時間の取得して差分を表示する
誤植ではありませんw
Time関数とTimer関数は別物です。
考え方は①のパターンと同じです。
処理開始時に開始時間用変数にTimer関数を使用します。
パターン①と違う点は、関数の戻り値のデータ型です。
それに伴い、後述の表記の仕方にも違いが出ます。
Timer関数は、午前0時0分0秒からの経過した時間をsingle型(単精度浮動小数点型)の値で返します。(double型も可)
書き方は以下の様になります。
Dim StartTime As Single '処理の開始時刻を格納する変数領域
Dim EndTime As Single '処理の終了時刻を格納する変数領域
StartTime = Timer
'-------------------------------------------------------
' 何らかの大量の処理
'-------------------------------------------------------
EndTime = Timer
表記について
プログラムでは、本来非常に細かい数字まで持っています。
そのまま表示すると、人の目には分かりにくかったり、煩わしかったりすることもあると思います。
そのため、処理の計測時間を格納した後に、表記のために加工をしてあげましょう。
パターン①の表記
パターン①の表記については、計測時間の型がDateのため、下記の関数を使用します。
Hour関数:時間のみを表示します
Minute関数:分のみを表示します
Second関数:秒のみを表示します
引数にはDate型を用います
メッセージで表示する場合は
MsgBox (Minute(計測時間変数) & "分" & Second(計測時間変数) & "秒 かかりました")
のような形になります。
パターン②の表記
パターン②の場合は、Single型になりますので、純粋に秒数となります。
計測時間の粒度に応じてRound関数で丸めましょう。
サンプル
以下はサンプルです。
パターン①のサンプル
Private Sub CommandButton1_Click()
Dim StartTime As Date '処理の開始時刻を格納する変数領域
Dim EndTime As Date '処理の終了時刻を格納する変数領域
StartTime = Time
'-------------------------------------------------------
' 何らかの大量の処理
'-------------------------------------------------------
EndTime = Time
EndTime = EndTime - StartTime
MsgBox (Minute(EndTime) & "分" & Second(EndTime) & "秒 かかりました")
End Sub
パターン②のサンプル
Private Sub CommandButton2_Click()
Dim StartTime As Single '処理の開始時刻を格納する変数領域
Dim EndTime As Single '処理の終了時刻を格納する変数領域
StartTime = Timer
'-------------------------------------------------------
' 何らかの大量の処理
'-------------------------------------------------------
EndTime = Timer
EndTime = EndTime - StartTime
MsgBox (Round(EndTime / 60, 0) & "分" & Round(EndTime Mod 60, 0) & "秒 かかりました")
End Sub
おわりに
いかがでしたでしょうか?
計測時間については、お手軽に表示することもできます。
個人的には、作成中に処理時間が気になる時に今回のような処理を追加して時間を確認したりします。
実運用については、処理が終わった後に時間を数字でみるのがよいか、リアルタイムで進捗状況を見たいのかは、人や場面によっても変わると思いますので、うまく活用してみてください。