エクセルVBAで残りの処理時間と進捗を表示するVBAを作成しました。残り時間や進捗の表示方法にはステータスバーやプログレスバーに表示する方法があるのですが、ステータスバーに表示させる方がかなり簡単なので、ここではステータスバーに表示する方法を紹介します。コピペやカスタマイズしてご利用頂ければと思います。
スポンサーリンク
残りの処理時間の計算方法について
今回はVBAの進捗や残りの処理時間をステータスバーに表示させるようにします。
まず進捗のパーセンテージの計算方法ですが、これは簡単で現在の処理回数を全体の処理回数で割ったものが進捗を表します。
残りの処理時間についてですが、直近の処理にかかった時間をもとに残りの処理時間を推測することは可能です。
例えば上の図のように全体の処理が10回あったとして、今6回目までの処理が終了したとします。
この時5回目の処理から6回目の処理までにかかった時間が3秒だとすると、残りの処理回数は4回なので、3秒×4で12秒と推測することができます。
注意点としては進捗や残り時間を計算できるのはFor文などのループ処理があるもののみです。While文など条件次第で何回処理を行うか分からないものや、For文であっても1回あたりの処理時間が状況によって変わってくる場合は、進捗や残り時間の精度が悪くなります。
ソースコード
ソースコードは以下の通りです。
Sub 残り時間計測()
Dim time1 As Double
Dim i As Long
Dim pre_i As Long
Dim j As Long
Dim remaining_time As Double
Dim first_num As Long
Dim last_num As Long
first_num = 1
last_num = 50000
pre_i = first_num
time1 = Timer
'******************ここから処理*******************
For i = first_num To last_num
'********テスト用ループ処理***********
For j = 1 To 1000000
Next j
'********テスト用ループ処理***********
If (Timer - time1) > 1 Then '前回から1秒以上経過している場合に処理を実行
remaining_time = (Timer - time1) * (last_num - pre_i) / (i - pre_i) '残り時間計算
pre_i = i '現在のインデックスiを記憶
time1 = Timer '現在の経過時間を取得k
Application.StatusBar = _
"進捗: " & Int(100 * i / last_num) & "% " & _
"残り時間:" & _
Int(remaining_time / 3600) & "時間" & _
Int(remaining_time / 60) Mod 60 & "分" & _
Int(remaining_time) Mod 60 & "秒"
DoEvents
End If
Next i
'******************ここまで処理*******************
MsgBox "終了です"
End Sub
解説
今回のプログラムでは、進捗や残り時間は前回の処理から1秒以上経過している場合に、計測と更新をするようにしています。
インデックスiが更新されるたびに進捗や残り時間を更新する方法もあったのですが、その方法だと1回あたりの処理時間が短い場合に精度が悪くなる、プログラムの実行時間が増える、頻繁に更新するため見づらいなどの理由があったため、1秒ごとに計算するようにしました。
プログラムの処理時間に関しては下記の記事に記載していますので、あわせてご確認頂ければと思います。
【ExcelVBA】処理時間を計測する3種類のテンプレートを紹介
スポンサーリンク
コメント