Maniac

VBA高速化検証:ScreenUpdatingプロパティ

Application.ScreenUpdatingプロパティは、マクロ実行中の画面表示の更新を制御します。「False」に設定すると画面表示更新は行われず、「True」に設定、またはマクロが終了すると、画面表示更新がなされます。
マクロ実行の際に画面表示更新を行わないと、画面表示に関わる処理が省かれるため、一般的にはScreenUpdatingプロパティを「False」にすると高速化につながると認識されています。

今回、以下のことに疑問をもったため、いくつかの検証を行いました。
・画面表示更新の有り無しでどの程度処理速度に差が生まれるのか
・画面表示が変更されない処理(違うシートの処理、画面外セルの処理等)でも必要か
・ScreenUpdatingプロパティの設定にどの程度時間がかかるのか

検証1:画面表示更新の「有り」「無し」

まず、画面表示更新の「有り」と「無し」の場合で処理時間を比較しました。処理内容は、アクティブシートの見えている600セルに1~10の値を順次設定。それを10回行い、1回毎に処理時間を計測しました。



この結果からわかることは、画面表示更新「有り」の場合は「無し」と比較し圧倒的に時間がかかる。その差14.7倍

検証2:画面表示に変更がない処理

違うシートの処理や画面外セルの処理では、結果的に画面表示に変更はありません。そのようなケースではどの程度時間がかかるのか。今回は「True」に設定してある状態で検証を行いました。



この結果からわかること
・ScreenUpdatingが「True」でも、画面表示の更新が必要ない処理の場合は高速
・アクティブシートの画面外セルの処理は、違うシートの同様の処理と比較し約150%時間がかかる

検証1と検証2の比較

検証1と2を並べて比較してみました。600セルに1~10を順次書き出す処理内容は共通です。



この比較でわかること
アクティブシートでScreenUpdatingプロパティをFalseにするより、ScreenUpdatingプロパティを設定せず、違うシートで同様の処理を行う方が高速である。

検証3:ScreenUpdatingプロパティの設定にかかる時間

ScreenUpdatingプロパティの「False」+「True」にはどの程度時間がかかるのかを検証しました。



この結果からわかることは、ScreenUpdatingプロパティの設定「False」+「True」の処理時間は、私の環境で約7ミリ秒。Calculationプロパティの設定時間(0.856ミリ秒)、単一セルに値を設定する時間(0.0178ミリ秒)と比較すると、かなり時間のかかる処理だとわかります。

今回の検証からわかること

・アクティブシートの見えているセルの値設定といった処理を行う場合、ScreenUpdating=Falseだと、Trueと比較し6.8%の時間で済む。
・アクティブではないシートの処理では、ScreenUpdating=Falseは必要ない。むしろアクティブシートの処理でScreenUpdating=Falseにするより若干高速。
・ScreenUpdating=True(画面表示更新有り)でアクティブシートの画面外セルの処理は、アクティブシートの処理でScreenUpdating=Falseにする場合と比較し140%時間がかかる。
・ScreenUpdatingの設定(「False」+「True」)にかかる時間は、私の環境で約7ミリ秒。他のプロパティ設定よりかなり時間を要する。

結論

ScreenUpdating=False(画面更新なし)は場合によって必要。場合によっては少し遅くなる可能性あり。
最も高速なのは、違うシートがアクティブな状態で、ScreenUpdatingプロパティを設定せず、マクロを実行する方法。
アクティブシートの見えている範囲で、オブジェクトを処理する必要がある状況では、ScreenUpdating=Falseは必須。

※今回のテストは私の端末のみの検証であり、どのような環境でも、同様の結果を保証するものではありません。
※Excelのバージョンで結果に違いが出る事が考えられます。


検証テストコードとファイル

●検証テストのコード [ Code ]
●Excel97-2010 [Test_File] 検証テストを行ったファイルです。

ページトップへ戻る
Copyright(C) 2009- 坂江 保 All Rights Reserved.