動的配列は便利であるが、その扱いは少々面倒くさい。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で取り出しができる。これを知って早速業務に活かせるかというと微妙であるが、とりあえずそのようなデータ構造があることを知っておけばそれが必要になったときに閃くと思う。