【ExcelVBA】処理時間の計測あれこれ(クラス使用)

ExcelVBA,クラスの操作

以下の4パターン用意しました。
  1. 簡易計測
  2. 「計測開始」~「計測終了」までの処理時間を求める。
  3. 計測開始を基準点として複数回計測
  4. 「計測開始」を基準点として「計測開始」~「計測1」/「計測開始」~「計測2」の処理時間を求める。
  5. 計測点と計測点の間の処理時間を計測
  6. 「計測開始」~「計測1」/「計測1」~「計測2」/「計測2」~「計測3」などの処理時間を求める。
  7. 【応用】計測点と計測点の間の処理時間と合計時間を計測
  8. 「計測開始」~「計測1」/「計測1」~「計測2」と「計測開始」~「計測2」までの処理時間を求める。

簡易計測

「計測開始」から「計測終了」までの処理時間を計測します。
Class1の内容はクラスモジュールのClass1に書き込みください。

Class1 の内容


Private StartTime As Double
 
Property Let ProcessTime(Value As Double)
    StartTime = Value
End Property
 
Property Get ProcessTime() As Double
    ProcessTime = Timer - StartTime
End Property

標準モジュール の内容


Sub Sample1()

    Dim ClsTest As Class1: Set ClsTest = New Class1
    
    '計測開始
    ClsTest.ProcessTime = Timer
    
		MsgBox "ちょっとひとやすみ", vbInformation

    '計測終了
    MsgBox "処理時間: " & ClsTest.ProcessTime
    
End Sub

実行結果



計測開始を基準点として複数回計測

「計測開始」を基準点としたて「計測1回目」「計測2回目」の処理時間を求める
Class1の内容は上記の「簡易計測」と同じ内容です。変更点はありません。

Class1 の内容


Private StartTime As Double
 
Property Let ProcessTime(Value As Double)
    StartTime = Value
End Property
 
Property Get ProcessTime() As Double
    ProcessTime = Timer - StartTime
End Property

標準モジュール の内容


Sub Sample1()

    Dim ClsTest As Class1: Set ClsTest = New Class1
     
    '計測開始
    ClsTest.ProcessTime = Timer
     
    MsgBox "休憩", vbInformation
 
    '計測1回目(計測開始~計測1回目まで)
    MsgBox "計測開始点からの処理時間(1回目): " & ClsTest.ProcessTime
   
    MsgBox "休憩", vbInformation
 
    '計測2回目(計測開始~計測2回目まで)
    MsgBox "計測開始点からの処理時間(2回目): " & ClsTest.ProcessTime 
    
End Sub

実行結果

「計測開始」を基準点とした計測です。後に行くほど、処理時間が伸びます。





計測点と計測点の間の処理時間を計測

計測点間の処理時間を表示します。
Class1に、追加された箇所があります。
前回とは、計測結果の違いが明確になるように複数回計測しています。しつこくてごめんなさい。

Class1 の内容


Private StartTime As Double
 
Property Let ProcessTime(Value As Double)
    StartTime = Value
End Property
 
Property Get ProcessTime() As Double
    ProcessTime = Timer - StartTime
    StartTime = Timer  '←追加
End Property

標準モジュール の内容


Sub Sample1()

    Dim ClsTest As Class1: Set ClsTest = New Class1
    
    '計測開始
    ClsTest.ProcessTime = Timer
    
    MsgBox "休憩", vbInformation

    '計測1回目(計測開始~計測1回目までの処理時間)
    MsgBox "処理時間(1回目): " & ClsTest.ProcessTime
  
    MsgBox "休憩", vbInformation

    '計測2回目(計測1回目~計測2回目までの処理時間)
    MsgBox "処理時間(2回目): " & ClsTest.ProcessTime

    MsgBox "休憩", vbInformation

    '計測3回目(計測2回目~計測3回目までの処理時間)
    MsgBox "処理時間(3回目): " & ClsTest.ProcessTime
    
    MsgBox "休憩", vbInformation

    '計測4回目(計測3回目~計測4回目までの処理時間)
    MsgBox "処理時間(4回目): " & ClsTest.ProcessTime
    
    MsgBox "休憩", vbInformation

    '計測5回目(計測4回目~計測5回目までの処理時間)
    MsgBox "処理時間(5回目): " & ClsTest.ProcessTime
    
End Sub

実行結果











※なお、メッセージボックス「処理時間(*回目)」が表示されてからOKボタン押されるまでの時間は、次の「処理時間(*回目)」に加算されます。

【応用】計測点と計測点の間の処理時間と合計処理時間

表示は 『 処理時間: 5.21 / 合計処理時間:26.4 』 な感じです。

Class1 の内容

ProcessTime(0) ... 合計処理時間
ProcessTime(1) ... 計測点と計測点の間の処理時間

StartTime(0) ... 開始時間(初回のみ開始時間代入)
StartTime(1) ... 開始時間(都度、開始時間代入)

Private StartTime(0 To 1) As Double
 
Property Let ProcessTime(ByVal i As Long, Value As Double)
    StartTime(i) = Value '開始時間セット
End Property
 
Property Get ProcessTime(ByVal i As Long) As Double
    ProcessTime = Round(Timer - StartTime(i), 2)

    If i = 1 Then
        StartTime(i) = Timer  '開始時間再セット
    End If

End Property

標準モジュール の内容

サブプロシージャ毎の処理時間を計測する。

Private ClsTest As Class1
    
Sub Sample1()
    
    Set ClsTest = New Class1
    
    '計測開始
    ClsTest.ProcessTime(0) = Timer
    ClsTest.ProcessTime(1) = Timer
    
    Call S1
    Call S2
    Call S3
    
End Sub

Sub S1()
    
    MsgBox "休憩", vbInformation
    
    '計測ポイント
    MsgBox "S1 処理時間: " & ClsTest.ProcessTime(1) & " / 合計処理時間:" & ClsTest.ProcessTime(0)
    
End Sub

Sub S2()
    
    MsgBox "休憩", vbInformation
    
    '計測ポイント
    MsgBox "S2 処理時間: " & ClsTest.ProcessTime(1) & " / 合計処理時間:" & ClsTest.ProcessTime(0)
    
End Sub

Sub S3()

    MsgBox "休憩", vbInformation

    '計測ポイント
    MsgBox "S3 処理時間: " & ClsTest.ProcessTime(1) & " / 合計処理時間:" & ClsTest.ProcessTime(0)
    
End Sub

実行結果







※メッセージボックス「S* 処理時間・・・」が表示されてからOKボタン押されるまでの時間は、次の「S* 処理時間・・・」に加算されます。