配列を経由してコレクションに格納 の続き

昨日は、ある範囲の値をコレクションに格納する際、一旦配列に取り込んだ方が早いということを実測で確認した。

infoment.hatenablog.com

この内容について、下記コメントをお寄せいただいた。

下ごしらえがものすごい時間かかりそうなコードになってる…

そこで今回は、下ごしらえの部分についても高速化してみる。
f:id:Infoment:20181214181045p:plain

といっても恐らく今回のネタも、世界中で幾度となく検証されている。
なので、今回もサラリといってみる。

まず、昨日の下ごしらえ(原文)がこちら。

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秒。圧倒的に速い。笑っちゃうぐらい、速い。

時と場合によるのだろうけれど、やっぱり値の貼り付けは配列に限る。
と、改めて思った次第です。

参考まで。