YiaoWang
{@last-update}
前へ | 目次 | 次へ

Excel VBA:高速化 >ループ内:文字列に追加連結しない


結論

【改修前】
Public Sub Test1(Byval MAX_COUNT As Long)
    Dim s As String
    Dim i As Long
    For i = 1 To MAX_COUNT
        s = s & "xxxx"
    Next
End Sub

【改修後】
Public Sub Test2(Byval MAX_COUNT As Long)
    Dim ss() As String
    Dim s As String
    Dim i As Long
    For i = 1 To MAX_COUNT
        ReDim Preserve ss(i - 1)
        ss(i - 1) = "xxxx"
    Next
    s = Join(ss, "")
End Sub

説明

s = s & "x" のような文字列連結は、既存のsのメモリに"x"を追加するのではなく、 連結後の s & "x" を新しいメモリに格納し直します。 そのため、連結前の文字列が大きくなればなるほど、処理速度は累乗で劣化します。
上記を解決するために、.NET や Java などで文字列連結は StringBuilder を使用します。 VBAでは StringBuilder が存在しないため、配列に確保した後、Join関数で一気に連結させます。


参考:結論のソースの処理時間比較


MAX_COUNT Test1 Test2 Test2/Test1
1,000 0.0012秒 0.0008秒 66.6%
10,000 0.0750秒 0.0082秒 10.9%
100,000 14.0789秒 0.048秒 0.3%

参考ページ



前へ | 目次 | 次へ
inserted by FC2 system