進捗を確認する ③ 残り時間を推測するクラスモジュール
昨日は、何某かの処理について進捗を確認し、さらに残り時間を推測することに挑戦した。
infoment.hatenablog.com
折角作ったので、クラスモジュールにしてみた。
クラスモジュール(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
結果は昨日と同じだが、参考までに載せておく。
参考まで。