マクロ開発時、二次元配列の要素数が読めない場合、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万行を超えたらどうするの?って問題は残りますよね。
なのでこれが正解!はなく、より良くしていく心意気が大切と考えています。
コメント