LoginSignup
3
5

More than 5 years have passed since last update.

VBA(Excel)高速化対策 -描画処理無効化編-

Posted at

概要

前回に引き続き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の値を格納し、色を変える処理だよ。)

これを、50*50の2,500セルに実行してみるよ。
ss_105.png

こんな感じ。

結構時間が掛かったよね。

速度計測を追加

具体的にどれぐらい掛かるのか、計測できるようにしてみるよ。

先のコードに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

出来たかな?

この状態で実行すると、処理が終わった後に、実行に掛かった時間が表示されるよ!
ss_106.png
約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

もう一度実行してみると…?
ss_107.png
約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行で導入できるから、とっても簡単ね!

有効に使っていこう!

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5