2010/05/16

VBAの画面描画を停止する方法

Sub NoDrawingSample()

With Application
    .ScreenUpdating = False             ' 画面描画を停止する '
    .Calculation = xlCalculationManual  ' 自動計算を停止する '
End With

' /// ここから '
' 処理を記述
' ここまで /// '

With Application
    .ScreenUpdating = True                  ' 画面描画の停止を解除する '
    .Calculation = xlCalculationAutomatic   ' 自動計算の停止を解除する '
End With

End Sub

ScreenUpdatingプロパティにFalseをセットして画面描画を停止すると、セルの選択やコピー等の操作により画面が更新されなくなるので動作がスマートになり、VBAの処理速度も向上します。

ScreenUpdatingプロパティは、プロシージャーを抜けると自動的にTrueがセットされますが、予期しないトラブルを防ぐために一連の処理が終了したら、Trueをセットして元に戻します。

Calculationプロパティについては、xlCalculationManualを指定すると計算方法が手動になります。

シート内にあらかじめ計算式が挿入されていてセルにデータを置いていくような処理では、既定の状態では、データが挿入される都度、「自動」で再計算されるので処理に時間がかかってしまいます。これを「手動」に切り替えて再計算されないようにすることで、ファイルの構成によっては処理速度の向上が期待できます。

ただし、再計算後の数値を処理の途中で参照するような場合は、正しい結果が得られなくなる恐れがあるので、必要に応じて、Calculateメソッドで再計算を実行します。なお、ScreenUpdatingプロパティとは異なり、Calculationプロパティは自動的に元の設定に戻らないため、処理が終了したら、明示的にxlCalculationAutomaticに戻す必要があります。

以下のページにVBAで処理を実行する際に、オフにするのが望ましいApplicationクラスの各種プロパティ、及び復元処理が実行される前にエラーで終了する可能性を加味したナイスなクラスモジュールが公開されています。

VBA - Excel. Applicationプロパティの話|システムエンジニアの戯言

0 件のコメント:

コメントを投稿