<概要>
今回は、既存のVBAコードにおける実行時間をストップウォッチのように計測する汎用プロシージャを紹介します。
<用途>
既存処理の実行時間を計測して、プログラムの中で時間を要している処理を特定する
<プロシージャ紹介>
Public Sub StopWatch([Reset As Boolean = False])
名前: StopWatch /Subプロシージャ
説明: 1回目の実行で計測を開始し、以降の実行で計測開始からの経過時間と前回実行時からの経過時間をイミディエイトウィンドウに表示する
'引数
'Reset・・・計測をリセットするかどうか(省略ならリセットしない)
<実行例>
次のようなコードを用意します。
各処理過程の途中途中でStopWatchプロシージャを実行しますが、最初の1回目は引数をTrueとして計測を初期化します。ストップウォッチでいえば「Start」です。
2回目以降のStopWatchプロシージャ実行では引数をFalseとして途中の実行時間をイミディエイトウィンドウに表示させます。
Public Sub TestStopWatch()
Call StopWatch(True) '計測初期化
Dim I As Long
Dim Value As Long
For I = 1 To (10) ^ 6
Value = Value + 1
Next
Call StopWatch(False) '計測1回目
For I = 1 To (10) ^ 7
Value = Value + 1
Next
Call StopWatch(False) '計測2回目
For I = 1 To (10) ^ 8
Value = Value + 1
Next
Call StopWatch(False) '計測3回目
For I = 1 To (10) ^ 9
Value = Value + 1
Next
Call StopWatch(False) '計測4回目
End Sub
実際にイミディエイトウィンドウに結果が表示されます。
<サンプルファイル>
<コード>
Public Sub StopWatch(Optional Reset As Boolean = False)
'時間を計測する
'1回目の実行で計測を開始し、以降の実行で計測開始からの経過時間と前回実行時からの経過時間をイミディエイトウィンドウに表示する
'20220927
'https://www.softex-celware.com/post/stopwatch
'引数
'Reset・・・計測をリセットするかどうか(省略ならリセットしない)
'実行回数加算
Static Count実行 As Long
If Reset = True Then
Count実行 = 1
Else
Count実行 = Count実行 + 1
End If
Static Time_開始時刻 As Double
Static Time_前回時刻 As Double
If Count実行 = 1 Then '初回実行
Time_開始時刻 = Timer '開始時刻保存
Time_前回時刻 = Timer '次回用に前回時刻として保存
Else '2回目以降実行
Dim Time_現在時刻 As Double: Time_現在時刻 = Timer
Dim Time_開始から経過時間 As Double: Time_開始から経過時間 = Time_現在時刻 - Time_開始時刻
Dim Time_前回から経過時間 As Double: Time_前回から経過時間 = Time_現在時刻 - Time_前回時刻
Time_前回時刻 = Time_現在時刻
Debug.Print "回数:" & Count実行 - 1, _
"開始から経過時間:" & Format(Time_開始から経過時間, "0.000") & "s", _
"前回から経過時間:" & Format(Time_前回から経過時間, "0.000") & "s"
End If
End Sub
Comments