切り替えたら元に戻す(画面更新などなど)
Excelマクロを実行中、画面更新を停止すると高速化が期待できる。
と、色々なサイトに書いてある。多くの場合、これは正しいようだ。今回は
「これが効かない場合」の話ではなく、処理が終わった後について思うこと
を書いてみる。
私も処理の高速化を目的として、昔から(つい最近まで)よく、このように
書いていた。
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
自己満足と言われれば、それまでの話。結構面倒だし。
なので、一年後には違うこと言っているかもしれません。
参考まで。