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エキスパートで深めることができます。
リンク
コメント