ExcelVBAで時間のかかる処理を走らせると、よくこう言われます。
- 「固まってる?」
- 「まだ終わらないの?」
- 「どれくらい進んでるの?」
実際は動いていても、画面に変化がないとフリーズしたように見えるのが原因です。
そこで便利なのが、Excel下部にあるステータスバー(一番下の帯)に進捗を出す方法です。
この記事では、初心者でもすぐ使える
ステータスバー進捗表示の基本〜実務向けテンプレまでまとめて紹介します。
ステータスバーに表示する基本(これだけでOK)
ステータスバーに文字を出すには、次の1行だけです。
Application.StatusBar = "処理中..."
そして、処理が終わったら必ず元に戻します。
Application.StatusBar = False
これを忘れると、Excelのステータスバー表示が戻らず「ずっと処理中のまま」になります。
実例①:ループ処理で進捗(件数)を表示する
大量処理では、ループの途中で進捗を更新すると効果的です。
Sub Sample_StatusCount()
Dim i As Long
Dim total As Long
total = 100000
For i = 1 To total
' 何かの処理(例)
Cells(1, 1).Value = i
' 1000件ごとに更新(更新しすぎると遅くなる)
If i Mod 1000 = 0 Then
Application.StatusBar = "処理中:" & i & " / " & total & " 件"
DoEvents
End If
Next i
Application.StatusBar = False
MsgBox "完了しました。", vbInformation
End Sub
ポイント
- 更新は毎回ではなく「数百〜数千回に1回」がおすすめ
DoEventsを入れると固まりにくくなる
実例②:%(パーセント)で進捗を出す
件数より「%」のほうが分かりやすいことも多いです。
Sub Sample_StatusPercent()
Dim i As Long, total As Long
Dim p As Double
total = 50000
For i = 1 To total
' 何かの処理
If i Mod 500 = 0 Then
p = i / total
Application.StatusBar = "処理中:" & Format(p, "0%") & "(" & i & "/" & total & ")"
DoEvents
End If
Next i
Application.StatusBar = False
MsgBox "完了しました。", vbInformation
End Sub
実例③:経過時間も出す(実務向け)
「あとどれくらい?」が気になる場合は、経過時間を表示すると親切です。
Sub Sample_StatusWithTime()
Dim i As Long, total As Long
Dim startTime As Double
Dim elapsed As Double
total = 80000
startTime = Timer
For i = 1 To total
' 何かの処理
If i Mod 1000 = 0 Then
elapsed = Timer - startTime
Application.StatusBar = "処理中:" & i & "/" & total & _
" 経過:" & Format(elapsed, "0.0") & "秒"
DoEvents
End If
Next i
Application.StatusBar = False
End Sub
※Timerは深夜をまたぐと0に戻る性質があります。超長時間の処理では注意してください。
よくある注意点
① ステータスバーを戻し忘れる
必ず最後にこれを書きましょう。
Application.StatusBar = False
② 更新しすぎて逆に遅くなる
ステータスバー更新もExcel操作なので、毎回更新すると遅くなります。
目安は「100〜5000件に1回」程度がおすすめです(処理内容によって調整)。
③ エラーで止まると戻らない
途中でエラーになったときも戻るように、On Error + Finally を組み合わせるのが安全です(次のテンプレ参照)。
【テンプレ】エラーでも必ず戻る!進捗表示つき大量処理の安全版
業務マクロでは、これをコピペして使うのがおすすめです。
Option Explicit
Sub SafeProgressTemplate()
Dim prevCalc As XlCalculation
Dim prevScreen As Boolean
Dim prevEvents As Boolean
Dim i As Long, total As Long
Dim startTime As Double
On Error GoTo Finally
' 状態退避
prevCalc = Application.Calculation
prevScreen = Application.ScreenUpdating
prevEvents = Application.EnableEvents
' 高速化
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
total = 100000
startTime = Timer
For i = 1 To total
' ===== ここにメイン処理を書く =====
' 進捗更新(1000件ごと)
If i Mod 1000 = 0 Then
Application.StatusBar = "処理中:" & Format(i / total, "0%") & _
"(" & i & "/" & total & ")" & _
" 経過:" & Format(Timer - startTime, "0.0") & "秒"
DoEvents
End If
Next i
Finally:
' 必ず元に戻す
Application.StatusBar = False
Application.ScreenUpdating = prevScreen
Application.Calculation = prevCalc
Application.EnableEvents = prevEvents
If Err.Number <> 0 Then
MsgBox "エラーが発生しました。" & vbCrLf & _
"番号:" & Err.Number & vbCrLf & _
"内容:" & Err.Description, vbExclamation
End If
End Sub
まとめ:進捗表示があるだけで「フリーズ不安」は激減する
- ステータスバー表示は
Application.StatusBarだけでできる - 更新しすぎると遅くなるので「間引く」のがコツ
- DoEventsと組み合わせると固まりにくい
- 最後は必ず
Application.StatusBar = Falseで戻す
長い処理ほど、進捗表示があるだけでユーザーの安心感が大きく変わります。
ぜひ、業務マクロの「基本装備」として入れてみてください。

コメント