こんにちは、Ryoです。
VBAを使って検査工程の計測制御などを行っていると、処理の開始から終了までの時間を測りたいことがあります。他にも純粋に実行時間を計測したり、相当な回数のループ処理を行う際に発生する処理時間を把握したいこともありますから、今回はその際に使用するWindowsAPIのtimeGetTime関数について書いていきたいと思います。
1.サンプル概要
今回は時間の測定が目的なので、画像のような簡単な表を準備しループ処理を行いますが、1回目を1千万回、2回目以降は累積して加算していきますますので5回目は5千万回とします。
その回数をループさせた際の計測時間をセルに書き込んでみます。
実行後の計測結果は以下の通りです。
私のPC環境では1千万回ループ処理で約0.4secでしたが、ハイスペックPCなら更に計測時間も短縮されるものなのか、この時間が標準的なのかはわからないです(笑)
2.サンプルコード
'timeGettime関数の宣言 Declare Function timeGetTime Lib "winmm.dll" () As Long Sub Sample1() Dim S_Time, Num, Time_msec, Time_sec As Long Dim i, j As Long For i = 1 To 5 '処理開始時間の取得 S_Time = timeGetTime Num = i * 10000000 Cells(i + 3, 3) = Format(Num, "#,###") Do j = j + 1 Loop Until j = Num 'ループ処理後に経過時間を取得(返り値はmsec) Time_msec = timeGetTime - S_Time Cells(i + 3, 4) = Time_msec Cells(i + 3, 5).NumberFormatLocal = "0.00" Cells(i + 3, 5) = Time_msec / 1000 j = 0 Next i End Sub
実行開始してからの処理時間を計測するには、timeGetTime関数を使用します。
構文としては特になく、API関数はモジュールの宣言部分に記述すれば良いので、
Declare Function timeGetTime Lib “winmm.dll” () As Long
この部分があれば、以降はtimeGetTimeだけで取得出来ます。
サンプル動作としてはループ処理の前に開始時間を取得し、ループ完了後に再度取得して開始時に取得した時間を差し引くことで、経過時間を算出しています。
このtimeGetTimeで取得する時間は返り値がmsec(ミリ秒)なので、便宜上sec(秒)でも表示する為にTime_msec / 1000としていますが、実際はシートの該当セルに数式入れておけば済むことですからね。敢えて入れたのは「返り値はmsec」を強調したかっただけです(笑)
もう一つ、本題とは反れますが当サンプルのループ回数最大で5千万回で実行すると私のPCでは負荷が大きいのか「画面がチラつく」ことがあるので、試される場合は数万回程度にした方が良いかと思います。
3.まとめ
処理時間の計測であれば簡単に把握することが出来ます。1msec単位で正確に把握したいようなケースの場合では精度的に微妙なので難しいですが、10~100msecレベルであれば比較・検証などに使えるのではないかと思います。
処理時間の測定を行いたいケースはあまり多くはないと思いますが、私のように生産ラインの検査工程で計測制御を行うような場合は、工程のサイクルタイムに影響ありますから結構気にすることが多いということもありますので、機会があればご検討くださいませ!
以上、WindowsAPIのtimeGetTime関数を使用して時間を計測する方法でした!
今回の記事が何かの参考になれば幸いです。
Ryo