配列は、複数の値を格納できる変数です。 3つのデータを格納したいのなら、3つの要素を持つ配列を宣言して使います。 では、マクロを実行するまで扱うデータの数がわからない場合はどうしたらいいのでしょう。 たとえば、フォルダに保存されている全ファイルを配列に格納するようなケースです。 いくつのファイルが存在するかはマクロを実行してみなければわかりません。 こんなときは、要素数を指定しないで配列を宣言します。 配列の要素数は、マクロのコード内で自動的に設定させます。 こうした配列を「動的配列」と呼びます。
動的配列の宣言は、配列の要素数を指定しないで宣言します。 コード中で配列の要素数を変更するときは、ReDim 配列名(要素数)のように、ReDimステートメント使います。 このとき、それまで配列に格納されていた既存のデータはクリアされてしまいます。 次のコードを実行すると、buf(1)〜buf(3)は空欄になります。Sub Sample2() Dim buf() As String, i As Long ReDim buf(3) buf(1) = "tanaka" buf(2) = "suzuki" buf(3) = "yamada" ReDim buf(4) buf(4) = "sato" For i = 1 To 4 MsgBox "buf(" & i & ")=" & buf(i) Next i End Sub配列の要素数を変更しても、既存のデータを残すには、ReDimステートメントにPreserveというキーワードを付けて実行します。Sub Sample3() Dim buf() As String, i As Long ReDim buf(3) buf(1) = "tanaka" buf(2) = "suzuki" buf(3) = "yamada" ReDim Preserve buf(4) buf(4) = "sato" For i = 1 To 4 MsgBox "buf(" & i & ")=" & buf(i) Next i End Sub動的配列の要素がいくつあるかは、要素数の上限を返すUBound関数でわかります。 次のコードは、C:\フォルダの全ファイルを配列に格納します。Sub Sample1() Dim Files() As String, cnt As Long, buf As String buf = Dir("C:\*.*") Do While buf <> "" cnt = cnt + 1 ReDim Preserve Files(cnt) Files(cnt) = buf buf = Dir() Loop MsgBox "全部で" & UBound(Files) & "個のファイルがあります" End Sub