進捗を確認する ③ 残り時間を推測するクラスモジュール

昨日は、何某かの処理について進捗を確認し、さらに残り時間を推測することに挑戦した。
infoment.hatenablog.com
折角作ったので、クラスモジュールにしてみた。
f:id:Infoment:20190201181906p:plain

クラスモジュール(ProgressClass)
Option Explicit

' 開始時刻
Dim StartTime As Single
' 経過処理数
Dim progress_index As Long
' 最大処理数
Public iMax As Long

' 測定開始。
Private Sub Class_Initialize()
    StartTime = Timer
End Sub

' ステータスバーをリセット。
Private Sub Class_Terminate()
    Application.StatusBar = False
End Sub

' 最大値のおおよそ十分の一 ※小数点切り下げ。
Private Property Get OneTenth() As Long
    OneTenth = WorksheetFunction.RoundDown(iMax / 10, 0)
End Property

' 進捗度。 ※10%単位
Private Property Get Progress() As Long
    Progress = WorksheetFunction.RoundDown(progress_index / OneTenth, 0)
End Property

' 経過時間。
Private Property Get ElapsedTime() As Single
    ElapsedTime = Timer - StartTime
End Property

' 平均処理時間
Private Property Get AverageTime() As Single
    ' 経過時間内に処理した個数から、1個あたりの平均処理時間を求める。
    AverageTime = ElapsedTime / progress_index
End Property

' 推定残り時間
Private Property Get RemainingTime() As Date
    ' 処理に必要な残り時間を推測する。
    RemainingTime = TimeSerial(0, 0, (iMax - progress_index) * AverageTime)
End Property

Public Sub UpdateStatusBar(i As Long)
    progress_index = i
    If progress_index Mod OneTenth = 0 Then
         Application.StatusBar = WorksheetFunction.Rept("■", Progress) & _
                                 WorksheetFunction.Rept("□", 10 - Progress) & _
                                 "(全数:" & iMax & " | 推定残り時間: " & RemainingTime & " )"
    End If
End Sub
標準モジュール

クラスモジュールに殆ど渡してしまったため、標準モジュールは大分すっきりした。

Sub Macro1()
    Dim PGC As ProgressClass
    Set PGC = New ProgressClass
        PGC.iMax = 659

    Dim i As Long
        For i = 1 To PGC.iMax
            ' サンプルなので、一時停止することで処理に代えている。
            Application.Wait [now()+"0:00:00.001"]
            Call PGC.UpdateStatusBar(i)
        Next
End Sub

結果は昨日と同じだが、参考までに載せておく。
f:id:Infoment:20190201182454g:plain

参考まで。