背景
Application.ScreenUpdating = False とすることによって画面更新を抑止すれば,処理速度が向上することはよく知られている。一方,Excel 2013でSDIになったためか,この方法が悪さをするケースも時々あり,Application.Visible = False とすることで解決できたケースもあった。
そこで,画面更新を抑止して処理速度向上を狙う場合の,各種方法の効果を評価した。
検証環境
- OS: Windows 10 Pro(64bit)
- アプリケーション: Excel 2013(64bit)
- CPU: Core i7 2.4GHz
- RAM: 16GB
- 仮想メモリ: OFF
検証方法
以下の手順で検証した。- VBAで,20000個のセルを1個ずつ選択するプログラム(下記)を作成する。
For I = 1 To 20000 Step 1
Cells(I, 1).Select
Next
- このプログラムを実行する際に,下記の各方法で画面更新を抑止し,処理時間をtimeGetTime関数で計測する。
- 対策なし
- Application.Top = 2000(ExcelウィンドウをPC画面の表示可能領域の外側に移動)
- Application.Visible = False(Excelウィンドウを非表示化)
- Windows(ThisWorkbook.Name).Visible = False(ウィンドウを非表示化)
- ThisWorkbook.IsAddin = True(ブックを一時的にアドイン状態にしてウィンドウを非表示化)
- Application.WindowState = xlMinimized(Excelウィンドウを最小化)
- Application.ScreenUpdating = False
- なお,キャッシュなど様々な影響があると思われるが,それらの影響が対等になるようにいろいろとりまぜて,計10回ずつ測定する。
結果
結果は下図のとおり。エラーバーは十分に小さいので,省略した。- 定番の Application.ScreenUpdating = False が最も高速であった。
- Application.Visible = False は,なにも対策しないときの2倍高速だが Application.ScreenUpdating = Falseよりは圧倒的に遅い。
0 件のコメント:
コメントを投稿