サイトについて      連絡先   検索

VBA の処理を高速化する

はじめに

Excel VBA の処理を高速化する方法を紹介します。

Application.ScreenUpdating で描画を止めるのが高速化に一番効果的です。

Timer 関数で処理時間を計測する方法も紹介します。

高速化

VBA の処理を高速化する一番の方法は、描画を停止することです。

Range("A1").Value = "あいう"のようにセルに対して操作すると、そのたびに Excel の画面が更新されます。これに時間がかかるため描画を停止させます。

描画を停止するには Application.ScreenUpdating = False のように指定します。


Public Sub Tips
    Application.ScreenUpdating = False

    ' 時間のかかる処理

    Application.ScreenUpdating = True
End Sub

処理の最後に Application.ScreenUpdating = True にして描画をするのを忘れないようにします。これだけで、十分に高速化を期待できます。

何分もの間描画を停止するとフリーズしているように見えるので、途中で更新したいときは次のようにします。


Public Sub Tips
    Application.ScreenUpdating = False

    Dim count As Long
    Dim i As Long
    For i = 0 To 10000 ' ループ処理
        count = count + 1
        
        ' 処理

        ' 1000 回に 1 回描画する
        If count Mod 1000
            Application.ScreenUpdating = True
            Application.ScreenUpdating = False
        Next
    Next

    Application.ScreenUpdating = True
End Sub

描画したいタイミングで Application.ScreenUpdating = True にし、その後 False に戻します。

処理時間を計測する

Timer 関数」を使用して処理時間を計測できます。


Public Sub WatchTime
    Dim t As Single
    t = Timer

    ' 時間のかかる処理

    Debug.Print (Timer - t) ' 1.23 など秒数が確認できます
End Sub

1 ミリ秒もかからないような処理は 0 秒となり計測できません。同じ処理を 1000 回くらい繰り返せば、計測できるようになります。


Public Sub WatchTime
    Dim startTime As Double
    Dim stopTime As Double

    startTime = Timer

    Dim i As Integer
    For i = 1 To 1000
        ' 時間のかかる処理
    Next

    stopTime = Timer

    Debug.Print (stopTime - startTime) ' 1000 回分の経過時間
    ' 1000 で割ると 1 回の時間になる
End Sub

その他の高速化

描画を停止する以外に高速化するポイントを紹介します。効果はわずかの可能性があります。

コードを短くする

コードを書けば書くほど処理が多くなります。できるだけ短く、少ない行数でやる方法を見つけます。

無駄な処理をやめる

セルを初期化するときに、書式設定していないのに書式を初期化するなどやらなくていい処理はやめます。

本当に必要な処理だけをやれば高速化につながります。

型を指定する

Variant や Object などあいまいな型で処理をするより、Integer など型を指定した方が高速化します。

関連ページ