セルを一つ一つ処理するよりも配列としてメモリ上に展開すると、高速になります。慣れるまで少々難しいかもしれませんが劇的に効果があります。
高速化の効果測定に使う処理
高速化の効果測定ベンチマーク
処理前の速度はこのシリーズの①での数値「11.55秒」をベンチマークにします。
配列に取り込んで貼り付けてみる
Dim v As Variant で宣言して起き
v = データの範囲 とすることで取り込めます。
ソースコード
Option Explicit
Sub test_proc()
Dim startTime As Double
Dim endTime As Double
Dim responceTime As Double
startTime = Timer
'メイン処理
Dim endrow, endcol As Long
endrow = 100
endcol = Cells(1, Columns.Count).End(xlToLeft).Column + 1
Dim v As Variant
v = Range(Cells(1, 1), Cells(endrow, endcol)) 'variantに取り込む
Range(Cells(1, "F"), Cells(endrow, endcol + 4)).Value = v '配列から貼り付ける
endTime = Timer
responceTime = endTime - startTime
MsgBox (responceTime & "秒")
End Sub

測定結果は0.0078秒でした。
11.55秒→0.0078秒なので、処理速度は1480倍です。
おまけ 100倍を処理してみる
100行ではなく10000行まで、100倍の処理量で実行してみました。
Option Explicit
Sub test_proc()
Dim startTime As Double
Dim endTime As Double
Dim responceTime As Double
startTime = Timer
'メイン処理
Dim endrow, endcol As Long
endrow = Cells(Rows.Count, "A").End(xlUp).Row
endcol = Cells(1, Columns.Count).End(xlToLeft).Column + 1
Dim v As Variant
v = Range(Cells(1, 1), Cells(endrow, endcol)) 'variantに取り込む
Range(Cells(1, "F"), Cells(endrow, endcol + 4)).Value = v '配列から貼り付ける
endTime = Timer
responceTime = endTime - startTime
MsgBox (responceTime & "秒")
End Sub
測定結果 0.13秒。
100倍の量にしたのに処理時間は0.0078秒⇒0.13秒で、17倍くらい。

まとめ
- データをセルとして扱うのではなく配列として取り込むと高速になる
- データ量が100倍になっても実行時間は10数倍程度
- そもそも実行時間が0コンマ何秒レベル
VBAエキスパートのスタンダードレベルでもこの方法は解説されています。(配列変数)
リンク
コメント