はじめに
VBAで配列を Dim myArray(1 To 5)
のように宣言すると、そのサイズは固定されます。しかし、プログラムを実行してみないと、配列にいくつの要素を格納する必要があるか分からない、という場面は非常に多くあります。例えば、条件に一致するデータの件数だけ、配列のサイズを確保したい場合などです。
このような場合に使うのが「動的配列」です。動的配列は、宣言時にはサイズを決めず、後から ReDim
という命令でサイズを自由に変更できます。
この記事では、動的配列の基本的な使い方と、配列のサイズを変更する際に元のデータを保持したまま拡張するための、非常に重要なキーワード Preserve
の使い方を解説します。
動的配列の基本的なサンプルコード
このマクロは、まず2つの要素を持つ動的配列を作成し、その後、元のデータを保持したまま、さらに2つの要素を追加して合計4つの要素を持つ配列に拡張します。
完成コード
' 動的配列のサイズを変更する
Sub DynamicArrayExample()
'--- 1. サイズを指定せずに動的配列を宣言 ---
Dim userList() As String
'--- 2. ReDimで最初のサイズを決定 (2要素分) ---
ReDim userList(1 To 2)
userList(1) = "佐藤"
userList(2) = "鈴木"
Debug.Print "--- 最初のReDim後 ---"
Debug.Print userList(1) ' -> 佐藤
Debug.Print userList(2) ' -> 鈴木
'--- 3. ReDim Preserveで、元の値を保持したままサイズを拡張 ---
ReDim Preserve userList(1 To 4)
userList(3) = "高橋"
userList(4) = "田中"
Debug.Print vbCrLf & "--- ReDim Preserve後 ---"
Debug.Print userList(1) ' -> 佐藤 (値が保持されている)
Debug.Print userList(2) ' -> 鈴木 (値が保持されている)
Debug.Print userList(3) ' -> 高橋
Debug.Print userList(4) ' -> 田中
'--- 4. 最終的な配列をセルに一括で書き出す ---
Worksheets("Sheet1").Range("B2").Resize(1, 4).Value = userList
End Sub
コードの解説
1. 動的配列の宣言
Dim userList() As String
動的配列を宣言するには、Dim
で配列名を宣言する際に、カッコ ()
の中を空にします。これにより、VBAはこの配列のサイズが後から変更されることを認識します。
2. ReDim
によるサイズ決定
ReDim userList(1 To 2)
ReDim
(Re-Dimensionの略) は、動的配列のサイズを実際に決定(または再定義)する命令です。この時点で、userList
は2つの要素を持つ配列になります。
注意: もしこの配列に既にデータが入っている場合、Preserve
を付けずに ReDim
を実行すると、配列の中身は全て消去(初期化)されてしまいます。
3. ReDim Preserve
によるデータ保持
ReDim Preserve userList(1 To 4)
これが、動的配列を扱う上で最も重要なポイントです。
Preserve
キーワードをReDim
の後ろに付けることで、VBAは配列の既存の値をすべて保持したまま、サイズを変更します。- この例では、「佐藤」「鈴木」という元の値を残したまま、サイズを4に拡張しています。
Preserve
がないと、この2つの値は消えてしまいます。
ReDim Preserve
の制約: Preserve
を使う場合、変更できるのは配列の最後の次元のサイズだけです。例えば、ReDim Preserve myArray(1 To 5, 1 To 10)
を ReDim Preserve myArray(1 To 5, 1 To 20)
に変更することはできますが、ReDim Preserve myArray(1 To 10, 1 To 10)
のように最初の次元(行数)を変更しようとするとエラーになります。
まとめ
今回は、VBAの動的配列と、ReDim
/ ReDim Preserve
の使い方を解説しました。
- サイズが未定の配列は、
Dim 配列名()
のようにカッコを空にして宣言する(動的配列)。 ReDim
で、後から配列のサイズを決定・変更する。- 既存のデータを残したままサイズを変更したい場合は、必ず
ReDim Preserve
を使う。
動的配列を使いこなせば、処理するデータの量に応じてプログラムを柔軟に対応させることができます。特に ReDim Preserve
は、実務で非常に多用される重要なテクニックですので、ぜひマスターしてください。