VBA 進捗表示 プログラムの進み具合

したい事(逆引き)
スポンサーリンク

スポンサーリンク

1. はじめに

Excel VBAを使って長時間処理を行う場合、ユーザーからすると「本当に処理が動いているのか?」と不安になることがあります。特に、大量のデータを処理したり、複数のファイルを開いて集計するような処理では、数十秒から数分かかることも珍しくありません。その際に、画面下段に進捗を表示することで、ユーザーに「処理がどれくらい進んでいるのか」「まだ動いているのか」を知らせることができます。これにより、安心感や操作性が大幅に向上します。

VBAで画面下段に進行状況を表示する代表的な方法は Excelのステータスバー を利用することです。Excelウィンドウの左下にあるステータスバーにメッセージを表示することで、処理の進み具合を動的に伝えることができます。


2. ステータスバーの基本

Excelのステータスバーは通常、「準備完了」「入力モード」「平均値や合計値」などが表示される領域です。VBAでは Application.StatusBar プロパティを使うことで、この表示を自由に変更できます。

基本的な使い方は以下の通りです。

Application.StatusBar = "メッセージを表示できます"

これにより、ステータスバーに任意の文字列を出力できます。表示を元に戻すときは次のようにします。

Application.StatusBar = False

この False の代入が重要で、処理終了後にこれを忘れると、通常の表示(平均や合計など)が戻らなくなってしまいます。


3. 進捗をパーセントで表示する

ステータスバーを使った最もシンプルな進捗表示は、処理ループの中で現在の進行度を表示する方法です。

サンプルコード

Sub ProgressStatusBar()

    Dim i As Long
    Dim maxCount As Long
    
    maxCount = 100
    
    Application.StatusBar = False ' 初期化
    
    For i = 1 To maxCount
        Application.StatusBar = "処理中... " & i & " / " & maxCount & _
                                " (" & Format(i / maxCount, "0%") & ")"
        DoEvents ' 画面更新・ユーザー操作受付
        Application.Wait Now + TimeValue("0:00:01") ' サンプルで1秒待ち
    Next i
    
    Application.StatusBar = False ' 処理終了後にリセット
    
End Sub

上記を実行すると、Excelの左下に「処理中… 50 / 100 (50%)」のようにリアルタイムで表示されます。


4. ステータスバー表示のポイント

(1) DoEvents の活用

ループ中に DoEvents を入れないと、ステータスバーが更新されず、処理が一気に終わった時点で最終結果だけが表示されます。
DoEvents は画面更新やユーザー操作を処理するための命令で、これを入れることで表示がリアルタイムに切り替わります。

(2) 表示内容の工夫

単純に「50/100」と出すだけでなく、以下のような工夫が可能です。

  • パーセント表示
    Format(i / maxCount, "0%") でわかりやすい。
  • 推定残り時間
    開始時刻を記録し、経過時間から残り時間を予測することも可能。
  • 処理対象の名称
    「ファイル名」「シート名」などを同時に表示すれば、どの処理をしているか分かりやすい。

5. 疑似プログレスバーの表示

文字列を工夫すれば、ステータスバーに疑似的なプログレスバーを表示することもできます。

サンプルコード

Sub ProgressBarLike()

    Dim i As Long
    Dim maxCount As Long
    Dim barLength As Integer
    Dim filled As Integer
    
    maxCount = 50
    barLength = 30 ' プログレスバーの長さ(文字数)
    
    For i = 1 To maxCount
        filled = (i / maxCount) * barLength
        Application.StatusBar = "進捗: [" & String(filled, "■") & _
                                String(barLength - filled, "□") & "] " & _
                                Format(i / maxCount, "0%")
        DoEvents
        Application.Wait Now + TimeValue("0:00:05") ' サンプルで5秒待ち
    Next i
    
    Application.StatusBar = False
    
End Sub

このコードでは、ステータスバーに「進捗: [■■■■□□□□□□] 40%」のようなバーが表示されます。擬似的ではありますが、視覚的に進み具合を捉えやすくなります。


6. ステータスバー以外の方法との比較

(1) ワークシートのセルに表示

最も簡単な方法ですが、シートが書き換えられるため邪魔になることがあります。また、他のデータを誤って上書きするリスクもあるため注意が必要です。

(2) ユーザーフォームのプログレスバー

本格的に作り込む場合、ユーザーフォームを作成し、Labelコントロールを伸縮させて進捗を表現する方法があります。視覚的にはこちらが優れますが、開発工数が増えます。

(3) ステータスバーの強み

  • 画面下段に自然に表示される
  • ユーザー操作の邪魔にならない
  • 実装が数行で済む
  • 処理終了後は自動的に消せる

以上の理由から、「簡単に処理の進み具合を伝える」ならステータスバーが最もバランスの取れた方法です。


7. 実用的な応用例

(1) ファイル処理時

複数のExcelファイルを順番に開いて処理する場合、現在処理中のファイル名と進行度をステータスバーに表示すれば、ユーザーが状況を把握しやすくなります。

Application.StatusBar = "処理中: " & fileName & _
                        " (" & i & " / " & fileCount & ")"

(2) 大量データのループ処理

数万件のセルを処理する場合、一定件数ごとに進捗を更新すれば表示が滑らかになり、処理速度への影響も少なくなります。

If i Mod 100 = 0 Then
    Application.StatusBar = "進行中: " & i & " 件目処理中..."
    DoEvents
End If

(3) 残り時間の推定

開始時刻を startTime = Timer で記録し、(Timer - startTime) / i * (maxCount - i) で残り秒数を計算すれば、より親切な表示が可能です。


8. 注意点

  1. 処理終了後は必ず Application.StatusBar = False を実行すること
    これを忘れると、通常の「平均・合計」が表示されなくなります。
  2. DoEventsの入れすぎに注意
    毎回DoEventsを入れると処理が遅くなる場合があります。データ件数が多い場合は、一定間隔ごとに更新するのがおすすめです。
  3. ユーザーが途中で操作する可能性
    DoEventsを入れることでユーザーが操作できてしまうため、途中でマクロが中断されるリスクがあります。必要なら制御を工夫する必要があります。

9. まとめ

  • VBAで「画面下段」に進捗を表示するには Excelのステータスバー を利用するのが最も手軽。
  • Application.StatusBar に文字列を代入するだけで表示できる。
  • ループ処理の中で DoEvents を使いながら更新することで、リアルタイムに進行状況を伝えられる。
  • パーセント表示、件数表示、疑似プログレスバー、残り時間の推定など、工夫次第で表現の幅が広がる。
  • 終了後は Application.StatusBar = False で必ず元に戻すことが重要。
  • 見た目重視ならユーザーフォームを使う方法もあるが、開発効率や簡便さではステータスバーが最適。
タイトルとURLをコピーしました