昨日は、ある範囲の値をコレクションに格納する際、一旦配列に取り込んだ方が早いということを実測で確認した。
この内容について、下記コメントをお寄せいただいた。
下ごしらえがものすごい時間かかりそうなコードになってる…
そこで今回は、下ごしらえの部分についても高速化してみる。
といっても恐らく今回のネタも、世界中で幾度となく検証されている。
なので、今回もサラリといってみる。
まず、昨日の下ごしらえ(原文)がこちら。
Sub 下ごしらえ() Dim r As Range For Each r In Range("A1").Resize(10000, 100) r = r.Address(False, False) Next End Sub
完了までの時間を計測したところ、221.1秒だった。
次いで、画面の更新を次の一文で一時停止してみる。
Application.ScreenUpdating = False
止めたものは用事が済み次第、元に戻しておこう。
(Application.ScreenUpdating = True)
Sub 下ごしらえ() Dim r As Range Application.ScreenUpdating = False For Each r In Range("A1").Resize(10000, 100) r = r.Address(False, False) Next Application.ScreenUpdating = True End Sub
完了までの時間は、233.5秒。ほとんど変わらない。
むしろ若干、伸びてすらいる。
それでは最後に、一旦配列に入れてから張り付けてみる。
Sub 下ごしらえ() Dim seq(1 To 10000, 1 To 100) As Variant Dim i As Long Dim j As Long For i = 1 To UBound(seq, 1) For j = 1 To UBound(seq, 2) seq(i, j) = Cells(i, j).Address(False, False) Next Next Cells(1, 1).Resize(10000, 100) = seq End Sub
完了までの時間は、6.9秒。圧倒的に速い。笑っちゃうぐらい、速い。
時と場合によるのだろうけれど、やっぱり値の貼り付けは配列に限る。
と、改めて思った次第です。
参考まで。