概要
前回に引き続きVBA高速化対策です。
今回の「描画処理の無効化」も処理回数が嵩む場合にはかなり有効です。
早速、実働サンプルを綴っていきます。
本編
サンプル
このような処理があったとします。
Private Sub MyButton_Click()
Dim myRange, e As Range: Set myRange = Selection
' - 処理 -
For Each e In myRange
With e
.Value = CInt(Rnd * 9) ' 0~9の値をランダムで格納
.Interior.color = RGB(Rnd * 255, Rnd * 255, Rnd * 255) ' セルの色もランダムで変更
End With
Next e
End Sub
(選択中のセルにランダムで0~9の値を格納し、色を変える処理だよ。)
こんな感じ。
結構時間が掛かったよね。
速度計測を追加
具体的にどれぐらい掛かるのか、計測できるようにしてみるよ。
先のコードに2行追記するよ。
上側に Dim startTime As Single: startTime = Timer
下側に MsgBox "所要時間 : " & Format(Timer - startTime, "0.00") & "秒"
を追記してね!
Private Sub CommandButton1_Click()
Dim startTime As Single: startTime = Timer ' [追記]
Dim myRange, e As Range: Set myRange = Selection
' - 処理 -
For Each e In myRange
With e
.Value = CInt(Rnd * 9)
.Interior.color = RGB(Rnd * 255, Rnd * 255, Rnd * 255)
End With
Next e
MsgBox "所要時間 : " & Format(Timer - startTime, "0.00") & "秒" ' [追記]
End Sub
出来たかな?
この状態で実行すると、処理が終わった後に、実行に掛かった時間が表示されるよ!
約15秒…。 (※環境によって異なるよ)
描画処理を無効化
今度は今回の高速化対策「描画処理無効化」を導入してみるよ!
またまた処理の上下に2行追記するよ。
上側に Application.ScreenUpdating = False
下側に Application.ScreenUpdating = True
を追記してね!
Private Sub CommandButton1_Click()
Dim startTime As Single: startTime = Timer
Dim myRange, e As Range: Set myRange = Selection
' 画面更新無効化
Application.ScreenUpdating = False ' [追記]
' - 処理 -
For Each e In myRange
With e
.Value = CInt(Rnd * 9)
.Interior.color = RGB(Rnd * 255, Rnd * 255, Rnd * 255)
End With
Next e
' 画面更新再開
Application.ScreenUpdating = True ' [追記]
MsgBox "所要時間 : " & Format(Timer - startTime, "0.00") & "秒"
End Sub
もう一度実行してみると…?
約8.5秒! (※環境によって異なるよ)
半分ぐらいになったね!
解説
コンピューターにとって描画処理はとても重労働なんだね!
今回の場合、
With e
.Value = CInt(Rnd * 9)
.Interior.color = RGB(Rnd * 255, Rnd * 255, Rnd * 255)
End With
この処理の度に描画処理が行われるから、2,500セルを対象にした場合、2,500回も描画処理が行なわれちゃうよ!
途中経過を表示する必要がない場合は、処理に入る前に描画処理をOFF(Application.ScreenUpdating = False
)にして、
処理が終わった後に描画処理をON(Application.ScreenUpdating = True
)することで、描画処理を1回にすることができるよ!
たった2行で導入できるから、とっても簡単ね!
有効に使っていこう!