PR

エクセルVBA 高速化① - 画面描画を止めたら2倍速くなった

VBAまずこれから
スポンサーリンク

3回シリーズでエクセルVBAを2倍速~8488倍速に高速化します。
マクロ記録機能が手放せない方や、または他人の作ったコードなので手が出ないような場合、これをやるだけで効果が出るかもしれません。もっとも手軽で結果も出やすい方法の一つです。
マクロ記録機能で作ったマクロを実行すると画面がチャカチャカ動くのが最初はなんだか嬉しいのですが、実はそれにより処理が遅くなっているのです。

時間の計測をするコードはこちら。

とても手軽で効果の出る高速化ですが、実は他にも高速化の方法はあります。

VBA高速化 ベンチマークに使う処理

処理前の状態と処理後の状態

A1~D10000までセル番号を記入したシートを用意しておき、これらを5列隣のF列~I列にコピペするマクロで、高速化の効果を計測してみます。
処理を重くするために罫線ごとコピーします。

【処理前の状態】

【処理後】
※思った以上に重くなりすぎたので、10000行ではなく100行にしました
 つまり、処理の終わりはこの形になります。

Option Explicit

Sub test_proc()
    Dim startTime As Double
    Dim endTime As Double
    Dim responceTime As Double
    
    startTime = Timer
    
    'メイン処理
    Dim i, j As Long
    For i = 1 To 100
        For j = 1 To 4
            Cells(i, j).Select
            Selection.Copy
            Cells(i, j + 5).Select
            ActiveSheet.Paste
        Next j
    Next i
    
    endTime = Timer
    responceTime = endTime - startTime
    
    MsgBox (responceTime & "秒")
End Sub

高速化前のソースコード

Option Explicit

Sub test_proc()
    Dim startTime As Double
    Dim endTime As Double
    Dim responceTime As Double
    
    startTime = Timer
    
    'メイン処理
    Dim i, j As Long
    For i = 1 To 100
        For j = 1 To 4
            Cells(i, j).Select
            Selection.Copy
            Cells(i, j + 5).Select
            ActiveSheet.Paste
        Next j
    Next i
    
    endTime = Timer
    responceTime = endTime - startTime
    
    MsgBox (responceTime & "秒")
End Sub

高速化前の測定結果

11.55秒でした。

画面描画を停止したら2倍高速になった

上のコードにこの2行を追加しました。
Application.ScreenUpdating = False ‘画面描画を停止
Application.ScreenUpdating = True ‘画面描画を再開

高速化したVBAのソースコード

Option Explicit

Sub test_proc()
    Dim startTime As Double
    Dim endTime As Double
    Dim responceTime As Double
    
    startTime = Timer
    Application.ScreenUpdating = False  '画面描画を停止
    
    'メイン処理
    Dim i, j As Long
    For i = 1 To 100
        For j = 1 To 4
            Cells(i, j).Select
            Selection.Copy
            Cells(i, j + 5).Select
            ActiveSheet.Paste
        Next j
    Next i
    
    endTime = Timer
    responceTime = endTime - startTime
    Application.ScreenUpdating = True   '画面描画を再開
    
    MsgBox (responceTime & "秒")
End Sub

処理速度2倍の効果

実行時間は5.67秒でした。11.55秒→5.67秒なので、処理速度は2倍の効果です。

100倍の10000行で比較してみる 

高速化前の処理時間

100倍の処理量でも実行してみました。10000行です。
高速化前の処理は1101.99秒でした。
11.44秒→1101.99秒なので数学的な直感通り、処理量が100倍になって処理時間も100倍です。

画面描画を停止したら2倍高速になった

そして高速化後の方は500.60秒でした。
同じく処理量が100倍に伴い処理時間も100倍になっています。

いずれにしても、高速化前が1101.99秒なので 1101.99÷500.60で処理速度2倍の効果です。

まとめ

  • 処理中の画面描画を止めると高速化できる
  • 今回の処理内容では効果は約2倍
    ※この処理での数値であって、常に2倍の効果が保証される訳ではありません
  • Application.ScreenUpdating = False ‘画面描画を停止
  • Application.ScreenUpdating = True ‘画面描画を再開

このやり方はVBAエキスパートで深めることができます。

コメント

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