セルを一つ一つ処理するよりも配列としてメモリ上に展開すると高速になります。
慣れるまで少々難しいかもしれませんが劇的に効果があります。
VBA高速化 ベンチマークに使う処理
処理前の速度はこのシリーズの①での数値「11.55秒」をベンチマークにします。
高速化の方法は他にもあります。
組み合わせることで相乗効果が得られます。
配列に取り込んで貼り付けるとVBAは高速化できる
Dim v As Variant で宣言して起き
v = データの範囲 とすることで取り込めます。
高速化したVBAのソースコード
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
配列化したら1480倍速くなった
測定結果は0.0078秒でした。
11.55秒→0.0078秒なので、処理速度は1480倍です。

100倍の10000行で比較してみる
高速化前の処理時間
100倍の処理量でも実行してみました。10000行です。
下記記事で計測した通り、高速化前のコードでは1101.99秒でした。
処理量が100倍になって処理時間も100倍です。
配列化したら8477倍速くなった
測定結果は0.13秒でした。
処理量100倍なら処理時間も100倍で0.0078秒→0.78秒かと思いきや、処理時間の増加は17倍ほど。
つまり処理量が増えるほど効果も大きくなっています。
高速化前が1101.99秒なので、1101.99÷0.13で処理速度8477倍の効果。

まとめ
- データをセルとして扱うのではなく配列として取り込むと高速になる
- 今回の処理での効果は1480~8477倍の効果
※この処理での数値であって、常にこの効果が保証される訳ではありません - 処理データ量が多いほど効果も期待できる
VBAエキスパートのスタンダードレベルでもこの方法は解説されています。(配列変数)
リンク
コメント