作成日 2025/11/3
最終更新日 2025/11/3

Application.ScreenUpdatingの設定

Application.ScreenUpdatingの設定はVBAの速度向上としては一般的なものです。
今更、一体それの何を解説するのか?というと、Exit Sub(Function)の対策です。

1.Application.ScreenUpdatingとは
2.プロシージャ終了パターンが複数ある場合の問題点
3.解決策
4.ダウンロード
5.更新履歴
6.参考文献

1.Application.ScreenUpdatingとは

 Application.ScreenUpdatingを解説しているページはいくらでもあるので、詳細はそちらに譲るとして、 簡単に説明すると、画面の描画を停止/再開させるプロパティでVBAの処理速度向上のために非常に良く使用されています。
例:
Module1 (標準モジュール)
Sub test()
    Application.ScreenUpdating = False
    ' ここに処理を書く
    Application.ScreenUpdating = True
End Sub


 すでに知っている方もいると思いますが、画面の描画を停止すると処理の速度が向上します。
しかし、やりたいことが終わったら元に戻す(Trueにする)処理を入れないと、画面の更新が止まったままになりますので、必ず戻す処理を入れます。
このページのトップへ

2.プロシージャ終了パターンが複数ある場合の問題点

このとき問題となるのが、プロシージャの終了パターンが複数ある場合です。
普通に考えるとExit Sub/Exit Functionのすぐ上に「Application.ScreenUpdating = True」を書かないといけない。
そういうとき、GoTo分を使用してプロシージャを抜ける前の共通処理に処理を飛ばすということは良く行われますが、このページでは別のアプローチをします。
このページのトップへ

3.解決策

 まずはソースを見てください。
Class1 (クラスモジュール)
Option Explicit

Private Sub Class_Initialize()
    Debug.Print "Application.ScreenUpdating = False"
    Application.ScreenUpdating = False
End Sub

Private Sub Class_Terminate()
    Debug.Print "Application.ScreenUpdating = True"
    Application.ScreenUpdating = True
End Sub


Module2 (標準モジュール)
Sub test()

    Dim obj1 As Class1
    Set obj1 = New Class1

    If Time > #12:00:00 PM# Then
       Debug.Print "午後です"
       Exit Sub
    End If

    Debug.Print "午前です"

End Sub


 実行すると、標準モジュールに
Application.ScreenUpdating = False
午後です
Application.ScreenUpdating = True
のように出力されます。

 2つ注意があります。
@実際にやってみると分かるのですが、
Dim obj1 As Class1
Set obj1 = New Class1

Dim obj1 As New Class1
とするのはダメです。理由は、DimステートメントでNewを使うと、初めてオブジェクトのプロシージャなどにアクセスしたときにNewされるのであって、すぐにNewされるのではないため。
Aエラー処理(On Error Goto)は必要です。エラーのまま処理を終了しようとすると、デバッグするか強制終了するかしないといけませんが、強制終了してしまうと、Class_Terminateが呼び出されないためです。

 さて、これはどういう作りなのかを説明します。
Newされたときに、「Application.ScreenUpdating = False」が実行されますが、「Application.ScreenUpdating = True」はオブジェクトが解放される前に実行されます。
オブジェクトが解放されるタイミングはVBAでは参照数が0になるときで、この例では、objScreenUpdatingCtl変数のスコープがプロシージャ内なので、そこから抜ける時です。
 こういったクラスの使い方は、C++でスマートポインタと同じよう考え方と思ってます。
 そして、今回のクラスの使い方はApplication.ScreenUpdatingだけではなく、以下にも使えそうです。
  1. Application.DisplayAlerts(警告の停止)
  2. Application.StatusBar(ステータスバーへの文字列出力)
  3. Application.Calculation(Excelの自動計算の設定)
  4. Application.EnableEvents(イベントの有効化/無効化)
  5. Application.Cursor(カーソルの形状)

このページのトップへ

4.ダウンロード

 Class1.cls
 Module1.bas

 clsScreenUpdatingCtl.cls(クラス名をそれっぽくして、コメント付与したもの。また、Debug文は消してあります)
このページのトップへ

6.更新履歴

2025/11/3 1.0 公開

このページのトップへ

6.参考文献

 このページを作成する際に参考にしたページなどです。

番号

リンク先の名称

リンク先の説明

リンクした日

1 マクロVBAの開始時と終了時に指定しておくべきApplicationのプロパティ - Excelの真髄 マクロVBAの開始時と終了時に指定しておくべきApplicationのプロパティを説明しています 2025/11/3

Prev Up Next  Top
このページのトップへ

このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方はメールをお願いします。

Microsoft 、Windows 、Visual Basic および Excel は米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。

このホームページの作成者はこれらの会社とはいっさい関係がありません。