なんだかGoodVibes

日々の勉強メモです。

VBAで動的配列

VBAにはC#などのようにList がありません。
配列も要素数を指定しなければいけないし…
動的に上限するデータを扱いたいときに困りますよね。
なので、今回は配列の要素数を動的に増減するサンプルをつくってみます。

' 配列を宣言し、要素数を0で初期化
Dim arr() As String
ReDim arr(0)

Dim count As Long
For count = 1 To 5
    ' 最大要素数にデータを格納
    arr(UBound(arr)) = count & "データ"

    ' 既存のデータ保持したまま要素数を拡張
    ReDim Preserve arr(UBound(arr) + 1)
Next

' 余分に拡張した要素を削除
ReDim Preserve arr(UBound(arr) - 1)

Dim item As Variant
Dim rowIdx As Long
rowIdx = 1
For Each item In arr
    Cells(rowIdx, 1).Value = item
    rowIdx = rowIdx + 1
Next item

サンプルの説明。

Dim arr() As String
ReDim arr(0)

ReDim はすでに定義されている要素数を再定義することができます。

arr(UBound(arr)) = count & "データ"

UBound は配列の使用できる配列の要素番号の最大値を返します。

ReDim Preserve arr(UBound(arr) + 1)

先程説明したReDimは 再定義することができるものですね。
今回はReDim の後ろにPreserve をつけています。
ReDim は再定義する際に、すでに格納しているデータを消してしまいます。
今回は、毎回毎回削除されては困るのでPreserve をつけて
すでに格納されているデータをのこしたまま要素数を再定義しています。
拡張する要素数の指定のために、UBound を使って現在の配列の要素番号の最大値+1をしています。

ReDim Preserve arr(UBound(arr) - 1)

最後に、余分に拡張した要素を削っています。

このようにVBAでも動的な配列を使うことができます。