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