t-hom’s diary

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

VBA 動的配列で要素数を意識せずに拡張する方法

f:id:t-hom:20160206132839p:plain
動的配列は便利であるが、その扱いは少々面倒くさい。Collectionなら、何番目の要素かを意識せずにAddできるが配列では要素の指定が必須だからである。

そこで、Ubound関数を使って要素数を意識せずに動的に拡張するコードを書いてみた。
別に裏技でも何でもないが、便利なイディオムとして良く利用するので覚えておくと何かと重宝すると思う。

たとえば、以下は選択されているセル範囲を配列に格納するサンプル。
セル範囲だけならVariantで直接格納する方法もあるが、この方法は色々応用が利く。

Sub RedimArraySample()
    Dim Arr() As String: ReDim Arr(0)    'Index 0で初期化
    Dim x As Range
    For Each x In Selection
        'Arrへの格納時に、添え字の数値指定ではなくUboundで最大要素に追加する。
        Arr(UBound(Arr)) = x.Value
        ReDim Preserve Arr(UBound(Arr) + 1)    '拡張
    Next x
    '1つ余分に作ってしまうので削除
    ReDim Preserve Arr(UBound(Arr) - 1)
    
    Debug.Print "----"
    Dim i As Long
    For i = 0 To UBound(Arr)
        Debug.Print Arr(i)
    Next i
    Debug.Print "----"
End Sub

ポイントは、最終要素にAddしたら次の要素に備えて拡張しているという点。
それから、ループを抜けると不要な要素が1つできているため、削除している点である。

この動的追加を応用したのが、以下の過去記事で作成したスタックである。
thom.hateblo.jp

スタックというのは積み上げ式のデータ構造で、最後に入れたデータから順に取り出すことができるというもの。Pushで格納、Popで取り出しができる。これを知って早速業務に活かせるかというと微妙であるが、とりあえずそのようなデータ構造があることを知っておけばそれが必要になったときに閃くと思う。

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