t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

ジャグ配列を展開(Ariawase版)

この記事は以下の記事の続編である。
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の内部でやってくれるので意識しなくて良い。
またメインコードのシンプルさも維持される。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。