〖ExcelVBA・マクロ〗ステータスバーに進捗を表示する方法|処理中でも「動いている」が伝わるマクロ

ステータスバーに進捗を表示する方法 ExcelVBA

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 で戻す

長い処理ほど、進捗表示があるだけでユーザーの安心感が大きく変わります。
ぜひ、業務マクロの「基本装備」として入れてみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました