切り替えたら元に戻す(画面更新などなど)

Excelマクロを実行中、画面更新を停止すると高速化が期待できる。
と、色々なサイトに書いてある。多くの場合、これは正しいようだ。今回は
「これが効かない場合」の話ではなく、処理が終わった後について思うこと
を書いてみる。
f:id:Infoment:20210619220839p:plain

私も処理の高速化を目的として、昔から(つい最近まで)よく、このように
書いていた。

Sub test()

    ' 画面更新の一時停止。
    Application.ScreenUpdating = False
    
    ' 何某かの処理
    
    ' 画面更新の一時停止を解除。
    Application.ScreenUpdating = True


End Sub

ところが最近、自分でこのように書いたが故の不都合な場面に出くわした。
それは、複数のサブプロシージャを連続して呼び出す場面での出来事。

Sub test2()

    ' 画面更新の一時停止。
    Application.ScreenUpdating = False
    
    ' ↓「test」を抜けるとき、一時停止を解除してしまっている。
    Call test
    
    ' ↓ この中では、画面更新の一時停止をしていない。
    '  (冒頭で停止していたので、まだ一時停止が有効と思っている)。
    '  そのため、高速画面更新が生じてしまう(画面がチラつく)。
    Call test3
    
    ' 画面更新の一時停止を解除。しかし実は、とくに解除されている。
    Application.ScreenUpdating = True

End Sub

個人的には特に、長くなってしまった処理を複数のサブプロシージャへ分割する
際に起きる事象だ。

そこで少し前から、強制的に解除するのではなく、「前に戻す」という処理を
採用するようになった。例えば、こんな感じだ。

Sub test_最近()

    ' 現状の画面更新設定を、変数に一旦退避させる。
    Dim ScreenUpdating_Backup As Boolean
        ScreenUpdating_Backup = Application.ScreenUpdating

    ' 画面更新の一時停止。
    Application.ScreenUpdating = False
    
    On Error GoTo er:
    ' 何某かの処理
    
    ' 画面更新の設定を元に戻す。
    Application.ScreenUpdating = ScreenUpdating_Backup
    
er:
    MsgBox "エラーが発生したため、処理を中断します。"
    ' 画面更新の設定を元に戻す。
    Application.ScreenUpdating = ScreenUpdating_Backup

End Sub

誰に言われたわけでもないが、この方が今までより、少し行儀が良いような
気がする(※個人の感想です)。

計算方法の設定を一時的に手動へ切り替える場合も同様で、こんな感じだ。

Sub test_最近2()

    ' 現状の計算方法の設定を、変数に一旦退避させる。
    Dim Calculation_Backup As XlCalculation
        Calculation_Backup = Application.Calculation
        
    ' 計算方法を手動に切り替え。
    Application.Calculation = xlCalculationManual
    
    On Error GoTo er:
    ' 何某かの処理
    
    ' 計算方法の設定を元に戻す。
    Application.Calculation = Calculation_Backup
    
er:
    MsgBox "エラーが発生したため、処理を中断します。"
    ' 計算方法の設定を元に戻す。
    Application.Calculation = Calculation_Backup
    
End Sub

自己満足と言われれば、それまでの話。結構面倒だし。
なので、一年後には違うこと言っているかもしれません。

参考まで。