この記事は以下の記事の続編である。
thom.hateblo.jp
動的配列の拡張部分でmmYYmmddさんからアドバイスをいただいた。
ReDim Preserve で +1 するのじゃなく、いっぱいになったら *2 していって、最後に削る方がいいですよ。
なるほど。
そういえばD*さんのサイトでAriawaseライブラリのArrayExがそのような設計になっていると紹介されていた。
Ariawaseライブラリ集で学ぶVBA(3) ArrayEx - ClockAhead 開発Blog
コーへーさんも過去に言及していたと思う。
ということでArrayExを使って書き換えてみた。
'以下、コーヘーさんのサイト(既に閉鎖)から引用したものを改造 Sub Sample20150820() Dim arr: arr = Array(Array(Array(Array(Array(1, 2, 3), 4, 5), 6, 7), 8), 9) Debug.Print Dump(ArrExplode(arr).ToArray) 'ToArrayを追加 'Array(1%, 2%, 3%, 4%, 5%, 6%, 7%, 8%, ...) End Sub Public Function ArrExplode(ByVal arr As Variant, Optional ByRef acc As ArrayEx) As ArrayEx If acc Is Nothing Then Set acc = New ArrayEx '固有型ではIsMissingが使えない。 If IsArray(arr) Then Dim v For Each v In arr If Not IsArray(v) Then acc.AddVal v End If Set ArrExplode = ArrExplode(v, acc) Next v Else Set ArrExplode = acc End If End Function
これでOptionalのアイデアも活きるし動的配列の拡張効率はArrayExの内部でやってくれるので意識しなくて良い。
またメインコードのシンプルさも維持される。