【エクセルVBA】ScreenUpdatingって効果あるの?

技術ネタ

ScreenUpdatingって効果あるの?

エクセルVBAで処理速度を改善したい時によく使われるのに、ScreenUpdatingというものがあります。

何をしているのかというと、画面の描写をいったんストップしたり、元に戻したりするという機能です。

具体的な使い方としては、処理最初に画面描写を止めて、処理の最後に元に戻します。

Application.ScreenUpdating = False
~処理~
Application.ScreenUpdating = True
という感じになります。
とくに難しい文ではないので、処理速度改善の効果があるかはあまり気にせず、決まり文句的に入れてる人も多いのではないでしょうか。
そこで一つの疑惑が浮かんできます。

処理速度改善、でもそれは昔の話では?

昔から、もう10年以上も前からこの手法は使われています。

それだけ時間が経つと、環境もずいぶん変わってますよね。

そこでいくつかの疑問がわいてきました。

  • パソコンスペックが良くなってるし、もうそこまで気にする必要ないのでは?
  • エクセルのバージョンも違うし、わざわざ画面描写止めなくても処理速度落ちにくいような改善されてるのでは?

要するに、盲信的に使っているけど、まだ効果あるの?という事。

実際にやってみた

考える暇があったら試してみよう!ということでやってみました。

実験内容

inシートからoutシートに、1行ずつコピー・貼り付けをする。

テストデータは500行まで用意。

コードはこんな感じ。

シンプルに、inシートのA列が空欄になるまで、ひたすらコピペするというもの。

Public Sub test1()

Dim st As Double ‘開始時間
Dim et As Double ‘おしまい時間
Dim cnt As Double ‘カウント

Application.ScreenUpdating = False

st = Timer

cnt = 1
Worksheets(“in”).Select

Do While Not Cells(cnt, 1) = “” ‘500回分あるよ

Rows(cnt).Copy ‘inシートからコピーして

Worksheets(“out”).Select ‘outシートに貼り付け
Rows(cnt).Select
ActiveSheet.Paste

Worksheets(“in”).Select ‘次の準備
cnt = cnt + 1

Loop

et = Timer

Worksheets(“test”).Select
Cells(1, 1) = et – st ‘時間計測

Application.ScreenUpdating = True

End Sub

画面描写が多い処理にしたかったので、inシートとoutシートを行ったり来たりするようにしてます。

後は赤くマーカーしているApplication.ScreenUpdatingをつけた状態と、消した状態のそれぞれで実行し、時間を計測します。

次に実験マシン環境。

  • Windows10Pro
  • エクセル2016
  • CPU Core i5-6500
  • メモリ 8G

さて結果は・・・

33秒 VS 13秒 で 効果あり!
画面描写が多い処理ということもあり、十分に効果ありました。

ScreenUpdatingは処理速度改善に効果があります!

 でも画面描写が多い処理だったからでは?

そう、これだけ差が開いたのは、画面描写が多い処理にしたことが大きいです。

というわけでテストコードを少しいじってみましょう。

Public Sub test2a()

Dim st As Double
Dim et As Double
Dim cnt As Double

st = Timer

cnt = 1
Worksheets(“in”).Select

Do While Not Cells(cnt, 1) = “”
Rows(cnt).Copy Worksheets(“out”).Rows(cnt)
cnt = cnt + 1
Loop

et = Timer

Worksheets(“test”).Select
Cells(1, 4) = et – st

End Sub

行ったり来たりを無くしました。

すると結果は11秒になりました。

そしてこれにScreenUpdatingをつけると、10秒になりました。

画面描写が少ない処理でも効果はいちおうあるようです。

まとめ

  • ScreenUpdatingは処理速度改善に効果がある
  • 画面描写が多い処理にはとくに効果がある
  • 画面描写が少ない処理にもいちおう効果はある

要するに、今でも十分効果があるということになります。

最後にApplication.ScreenUpdating = Trueを入れなくても、基本的には処理が終わればかってTrueに戻りますので、無くてもとくに問題ありません。
不測のエラー時などに、Falseのままになってしまう事があるので、念のため入れてる感じです。
そういえばここ数年、この事象に遭遇してないですね・・・。

コメント

タイトルとURLをコピーしました