和風スパゲティのレシピ

日本語でコーディングするExcelVBA

画面の描画を停止/再開する - ScreenUpdating

画面の描画を停止/再開する方法を解説します。

Application.ScreenUpdatingプロパティにFalse/Trueを指定することで、
マクロ実行中の画面更新を停止・再開できます。


主にマクロを高速化するために使用するプロパティです。

Applicationによるマクロ高速化シリーズのまとめ記事はこちらをどうぞ

基本構文

' 画面描画を停止
Application.ScreenUpdating = False

' 画面描画を再開
Application.ScreenUpdating = True

サンプルコード

Sub サンプルマクロ()

    ' マクロ実行冒頭で画面の描画を停止
    Application.ScreenUpdating = False

    ' マクロのメインコード
    
    ' ↓見た目上のセルは空のまま
    Dim R As Long
    For R = 1 To 1000
        Worksheets(1).Cells(R, 1) = 1
    Next
    
    ' ↓アクティブシートも見た目上は切り替わらない
    Worksheets(2).Activate
    
    ' ↓このブックも画面上は開いていないように見える
    Workbooks.Open "~~\○○.xlsm"
    
    ' マクロ終了時に描画を再開
    Application.ScreenUpdating = True
    ' ※ ここで値の表示、第2シートがアクティブ、開いたブックを表示等、
    ' 今まで描画せず貯めていた処理が一気に描画される

End Sub

解説

Application.ScreenUpdatingプロパティにFalse/Trueを指定することで、
マクロ実行中の画面更新を停止・再開できます。

主にマクロの高速化を目的に使用されることが多く、
特にDeleteやCopyなど、セルの構成にかかわる処理はかなり高速化されます。


反面、ただValueを変更するなどの処理はそれほど高速化効果はなく、
仲間の「Application.Calculation」の方がはるかに効果が大きいです。


高速化目的で使用する場合はこのプロパティだけでは片手落ちですので、
以下の4種を同時に設定してください。

Application.ScreenUpdating = False ' 描画の停止
Application.Calculation = xlCalculationManual ' 自動計算の停止
Application.EnableEvents = False ' イベントマクロの停止
Application.Cursor = xlWait ' マウスカーソル描画の停止

 
このコードを毎回4つ書くのは面倒ですので、汎用関数にするのがおすすめです。

Sub サンプルマクロ()

    Call Excelの自動更新を停止する

    ' マクロのメインコード

    Call Excelの自動更新を再開する

End Sub

' マクロ高速化用汎用関数
Sub Excelの自動更新を停止する()
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    Application.Cursor = xlWait
End Sub
Sub Excelの自動更新を再開する()
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    Application.Cursor = xlDefault
End Sub

この関数を用意しておけば、以降はCall1行で済むようになります。
個人用マクロブックなどにこの関数を用意しておきましょう。

詳しくはこちらの記事をどうぞ。

www.limecode.jp

描画が止まったままになったときの対処法

ScreenUpdating = False で停止した描画は、
通常はマクロの実行完了時(End Sub)で自動再開されます。

Sub サンプルマクロ()

    Application.ScreenUpdating = False

    ' マクロのメインコード
    
    Application.ScreenUpdating = True
    ' ↑このコードは最悪書き忘れても、

End Sub ' ← ここで自動で描画は再開する(Trueに戻る)

とはいえ上記で紹介した自動計算やイベントの停止は自動で再開されませんので、
ScreenUpdatingも一緒にTrueに戻してあげた方が確実でいいと思います。


さて問題はエラーが起きた場合で、
マクロがエラーで止まった場合は描画が再開されません。

この時、描画を再開させるには以下2つのいずれかの方法を用います。

イミディエイトウィンドウで再開を指示

Application.ScreenUpdatingはイミディエイトウィンドウでも設定可能です。

よって描画が止まったままになってしまったときは、

Application.ScreenUpdating = True

をイミディエイトウィンドウで実行すれば描画を再開することが可能です。

汎用関数をリボンやツールバーから実行

先ほど紹介した汎用関数2つのうち再開を行う以下の関数を再掲します。

Sub Excelの自動更新を再開する()
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    Application.Cursor = xlDefault
End Sub

 
このコードは先ほど他のマクロ内でCallして使っていましたが、
Subプロシージャですのでリボンやツールバーにも設定できます。

これを設置しておけばワンボタンで描画を再開できる上、
自動計算・イベントマクロ・マウスカーソルの復元もセットで行えます。


エラー時に一気に状態を復元できるため非常に便利なマクロになります。

関数としてももちろん便利ですので、ぜひとも活用していきましょう。