shikumika’s diary

日々の事務作業で手間なことを簡単にできる仕組み(自動化、方法など)、困ったことの解決方法を調べた備忘録

【Excel VBA】処理の進捗状況は表示して他の画面更新は停止

Excel VBAは、処理の進捗状況を表示しながら他の画面更新を停止することが可能です。

公式な情報は探せませんでしたが、ScreenUpdatingプロパティを使用して画面更新を停止した場合でも、ステータス バーの情報は更新される仕様のようです。

以前から仕様に変更はなさそうですが、動作確認のExcelは「Microsoft® Excel® for Microsoft 365 MSO」(バージョン2310)です。 

なお、ステータス バーは画面左下の位置で、テキスト情報が表示されます。

ステータスバーは画面左下の箇所でテキストを表示できます

ステータスバー

VBAサンプル

マクロの速度を向上させるために画面更新は停止し、処理が適切に実行されていることを確認できるように進捗状況をステータスバーに表示します。

なお、ステータスバーの更新頻度が高すぎると、進捗状況を適切に把握が困難なケースもあるので、IF文を利用して書き換え頻度を抑制したサンプルです

Sub 進捗状況は表示して他の画面更新は停止()
    Dim i As Long
    '画面更新の停止'
    Application.ScreenUpdating = False
    
    '事例でループ処理'
    For i = 1 To 1000
        'iが10で割り切れる時だけ、ステータスバーの更新'
        If i Mod 10 = 0 Then Application.StatusBar = i & " 番目の処理中"
        
        '画面更新が停止していることを示すための単なる事例として、セル選択'
        ActiveSheet.Cells(i, 1).Select
        
    Next i
    
    '画面更新の再開と、ステータスバーを既定のテキストに戻す'
    Application.StatusBar = False
    Application.ScreenUpdating = True

End Sub

補足説明

  • 画面更新の停止が不要な場合は「Application.ScreenUpdating」の記述は削除します。
  • Mod は、割算の余りのみを返す演算子です。
    上記はiが10で割り切れる時だけ、ステータスバーを更新しています。
    learn.microsoft.com

その他、「Application.ScreenUpdating」「Application.StatusBar」を利用した実用的なサンプルは以下です。

(Mod演算子は未利用)

shikumika.org

以上、Excel VBAで、処理の進捗状況を表示しながら他の画面更新は停止の事例でした。