今回はExcelVBAで処理中の画面を更新しない方法と使いどころをご説明します。
Excelは画面の更新(描画)が非常に遅いです。
そのため、頻繁に画面の更新が行われる処理時には、意図的に画面の更新を停止させることで処理速度を向上させます。
また、画面の更新を停止する以外にも処理を高速にする方法については、下記記事をご覧ください。
1.Application.ScreenUpdatingを使って画面の更新をとめる
画面の更新を止めるためには「Application.ScreenUpdating」を使います。
次のように記述します。
Application.ScreenUpdating = False '画面の更新停止
'処理
Application.ScreenUpdating = True '画面の更新開始
簡単ですね。
ループで膨大な画面更新が行われる場合等に、画面更新を止める事で処理速度が改善します。
2.Application.ScreenUpdatingの使いどころ
プロシージャ名の直下に「Application.ScreenUpdating=False」を記述して、画面を止めてもかまいませんが、そもそも処理が数分にわたるようなコードの場合はずっと画面が固まってしまいます。
そのため、「正しく動いているのか?」と不安になります。
適宜停止と更新を使い分けることで、VBAの処理が正常に実行されている事が伝わります。
次のような処理を一切画面更新を止めないパターンと、適宜止めるパターンで記述してみます。
A1~A50000に1~50000の数字を入力して、B列にすべて10倍にした数字を入力します。
一切画面更新を止めないパターン
一切画面を止めないと約11秒かかりました。
その間画面が動いているのはわかりますが、これでは処理が増えるほど待ち時間が増えます。
シート等画面を変える場合はチカチカしたりすることもあります。
特にシート遷移や、ブックの遷移が頻繁に行われる様な処理ではかなり煩わしく画面が動きます。
Sub Sample1()
Dim i As Long
For i = 1 To 50000
Cells(i, 1) = i
Next i
For i = 1 To 50000
Cells(i, 2) = Cells(i, 1) * 10
Next i
End Sub
適宜止めるパターンを止めるパターン
では、画面を適所で止めるパターンです。
Sub Sample2()
Dim i As Long
Application.ScreenUpdating = False '画面の更新停止
For i = 1 To 50000
Cells(i, 1) = i
Next i
Application.ScreenUpdating = True '画面の更新開始
Application.ScreenUpdating = False '画面の更新停止
For i = 1 To 50000
Cells(i, 2) = Cells(i, 1) * 10
Next i
Application.ScreenUpdating = True '画面の更新開始
End Sub
入力と出力処理の部分のみ画面の更新を停止しています。
こうする事で、A列の入力が完了後にA列の入力結果が表示され、B列の計算出力結果が完了後にB列が表示されます。
処理時間も若干ですが早くなります。
このように全ての処理を止めてしまうより、処理に時間のかかるループなどで更新を止めると良いかと思います。