作成日 2025/11/3
最終更新日 2025/11/3
Application.ScreenUpdatingの設定
Application.ScreenUpdatingの設定はVBAの速度向上としては一般的なものです。
今更、一体それの何を解説するのか?というと、Exit Sub(Function)の対策です。
Application.ScreenUpdatingを解説しているページはいくらでもあるので、詳細はそちらに譲るとして、
簡単に説明すると、画面の描画を停止/再開させるプロパティでVBAの処理速度向上のために非常に良く使用されています。
例:
Module1
(標準モジュール)
|
Sub
test()
Application.ScreenUpdating = False
' ここに処理を書く
Application.ScreenUpdating = True
End Sub
|
すでに知っている方もいると思いますが、画面の描画を停止すると処理の速度が向上します。
しかし、やりたいことが終わったら元に戻す(Trueにする)処理を入れないと、画面の更新が止まったままになりますので、必ず戻す処理を入れます。
このとき問題となるのが、プロシージャの終了パターンが複数ある場合です。
普通に考えるとExit Sub/Exit Functionのすぐ上に「Application.ScreenUpdating = True」を書かないといけない。
そういうとき、GoTo分を使用してプロシージャを抜ける前の共通処理に処理を飛ばすということは良く行われますが、このページでは別のアプローチをします。
まずはソースを見てください。
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だけではなく、以下にも使えそうです。
- Application.DisplayAlerts(警告の停止)
- Application.StatusBar(ステータスバーへの文字列出力)
- Application.Calculation(Excelの自動計算の設定)
- Application.EnableEvents(イベントの有効化/無効化)
- Application.Cursor(カーソルの形状)
Class1.cls
Module1.bas
clsScreenUpdatingCtl.cls(クラス名をそれっぽくして、コメント付与したもの。また、Debug文は消してあります)
2025/11/3 1.0 公開
このページを作成する際に参考にしたページなどです。
このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方は
メールをお願いします。
Microsoft 、Windows 、Visual Basic および Excel
は米国Microsoft
Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。
このホームページの作成者はこれらの会社とはいっさい関係がありません。