配列(一次元/二次元)

RedimPreserveより事前に領域確保したほうが速度が出る【ExcelVBA】

マクロ開発時、二次元配列の要素数が読めない場合、RedimPreserveで指定や要素の入れ直し
二次元配列を最小の要素数→任意の行数の配列で処理することは、処理自体奇麗と考えます。
処理は奇麗でも、件数が多いと処理スピードが業務に耐えられない場合があります。

10万行程度であれば上記やり方でもいいですが、30万行~100万行処理しようとすると、処理が追いつきません。

RedimPreserveより事前に領域確保したほうが速度が出る

下記のarr1とarr2()は同じように見えます。
実際にはVariant型なのか、Variant型の配列として定義されているかの違いはあります。

Public Sub test()

    Dim ExArray As Variant
    Dim sLen As Long
     
    
    '■①ループしながら配列+1を再定義→要素を入れなおす→配列に値を入れるを10万回繰り返す
    ReDim ExArray(5, 1)
    sLen = UBound(ExArray) + 1
    Dim i As Long
    For i = 1 To 100000
        ExArray = Call_ArraySizeUp(ExArray, sLen)
        sLen = UBound(ExArray) + 1
        ExArray(i, 1) = "aaa"
    Next

    '■②事前に20万行定義、配列に値を入れる→10万回処理後、不要行をCall_ArraySizeDownで削除
    ReDim ExArray(200000, 1)
    For i = 1 To 100000
        ExArray(i, 1) = "aaa"
    Next

    sLen = UBound(ExArray)
    ExArray = Call_ArraySizeDown(ExArray, sLen)
End Sub

まとめ

  • ①と②であれば②のほうが圧倒的に早いです。(実結果は省略)
  • プログラムなんて学校の勉強と違い、正解は複数あります。
    ※そのコードで進めるメリット・デメリットを考える必要があると思っています。
    上記であれば20万行を超えたらどうするの?って問題は残りますよね。
    なのでこれが正解!はなく、より良くしていく心意気が大切と考えています。

関連記事

コメント

タイトルとURLをコピーしました