PR

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

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

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行を追加しました。
Application.ScreenUpdating = False ‘画面描画を停止
Application.ScreenUpdating = True ‘画面描画を再開

ソースコード

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倍です。
※これはこの処理に限っての数値であって、常に2倍の効果が保証される訳ではありません

まとめ

  • 処理中の画面描画を止めると高速化できる
  • Application.ScreenUpdating = False ‘画面描画を停止
  • Application.ScreenUpdating = True ‘画面描画を再開

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

コメント

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