概要
ExcelVBAにて時間のかかる処理をした場合、あとどのくらい時間がかかりそうなのか知りたくなります。
本記事では、Excelウインドウのステータスバーに進捗状況(進捗率)を表示する方法をご紹介します。
進捗率表示
コード
Sub Function1()
'定数
Const indexStart = 0
Const indexEnd = 99999
'進捗率
Dim percent As Long
percent = -1
For i = indexStart To indexEnd
'時間のかかる処理
Debug.Print (i);
'進捗率
percent = Application.WorksheetFunction.RoundDown(i / indexEnd * 100, 0)
'ステータスバー設定
Application.StatusBar = "進捗(" & percent & "%)"
Next
'ステータスバー初期化
Application.StatusBar = False
End Sub
実行結果
実行すると、進捗状況がパーセントで表示されます。
解説
現在の進捗率(パーセント)をステータスバーに表示する機能です。
進捗率は、 現在インデックス ÷ 最終インデックス の結果を RoundDown 関数で小数点以下を切り捨てて算出します。
ステータスバー設定は、 Application.StatusBar プロパティに進捗率をセットします。
最後に Application.StatusBar に False をセットすることでステータスバーにセットした文字列を消去します。
進捗バー表示
コード
Sub Function2()
'定数
Const indexStart = 0
Const indexEnd = 99999
'進捗率
Dim percent As Long
percent = -1
'進捗バー情報
Const progressMax = 10
Dim progressCompleted As Long
Dim progressRemaining As Long
For i = indexStart To indexEnd
'時間のかかる処理
Debug.Print (i);
'進捗率
percent = Application.WorksheetFunction.RoundDown(i / indexEnd * 100, 0)
'進捗バー情報
progressCompleted = Application.WorksheetFunction.RoundDown(percent / 10, 0)
progressRemaining = progressMax - progressCompleted
'ステータスバー設定
Application.StatusBar = "進捗(" & percent & "%) " & String(progressCompleted, "■") & String(progressRemaining, "□")
Next
'ステータスバー初期化
Application.StatusBar = False
End Sub
実行結果
実行すると、進捗状況がパーセントと■で表示されます。
■で視覚的に把握できるので、進捗状況が分かりやすいです。
解説
現在の進捗率(パーセント)と進捗バーをステータスバーに表示する機能です。
進捗率は、 現在インデックス ÷ 最終インデックス の結果を RoundDown 関数で小数点以下を切り捨てて算出します。
進捗バーは、10個の"□"を表示し、進捗が10%毎に"■"に置き換えていきます。
ステータスバー設定は、 Application.StatusBar プロパティに進捗率と進捗バーをセットします。
最後に Application.StatusBar に False をセットすることでステータスバーにセットした文字列を消去します。
進捗バー表示(速度改善版)
コード
Sub Function3()
'定数
Const indexStart = 0
Const indexEnd = 99999
'進捗率
Dim percent As Long
Dim percent_prev As Long
percent = -1
percent_prev = -1
'進捗バー情報
Const progressMax = 10
Dim progressCompleted As Long
Dim progressRemaining As Long
For i = indexStart To indexEnd
'時間のかかる処理
Debug.Print (i);
'進捗率
percent = Application.WorksheetFunction.RoundDown(i / indexEnd * 100, 0)
'進捗率変化時
If percent <> percent_prev Then
percent_prev = percent
'進捗バー情報
progressCompleted = Application.WorksheetFunction.RoundDown(percent / 10, 0)
progressRemaining = progressMax - progressCompleted
'ステータスバー設定
Application.StatusBar = "進捗(" & percent & "%) " & String(progressCompleted, "■") & String(progressRemaining, "□")
End If
Next
'ステータスバー初期化
Application.StatusBar = False
End Sub
実行結果
実行すると、進捗状況がパーセントと■で表示されます。
実際に試して頂くと、今回のプログラムのほうが、速度が速いことが分かると思います。
解説
現在の進捗率(パーセント)と進捗バーをステータスバーに表示する機能の速度改善版です。
ステータスバー設定は速度が遅いため、極力アクセスを控える必要があります。
よって、本コードでは、進捗率に変化があった場合のみステータスバー設定を行い速度を改善しました。
進捗率は、 現在インデックス ÷ 最終インデックス の結果を RoundDown 関数で小数点以下を切り捨てて算出します。
進捗バーは、10個の"□"を表示し、進捗が10%毎に"■"に置き換えていきます。
ステータスバー設定は、進捗率に変化があった場合のみ行い、 Application.StatusBar プロパティに進捗率と進捗バーをセットします。
最後に Application.StatusBar に False をセットすることでステータスバーにセットした文字列を消去します。