VBAで配列に値を追加したいときは、ReDim Preserveを使って配列のサイズを広げるのが基本です。
ただし、値を追加するたびに ReDim Preserveを実行するため、件数が多い場合は処理が重くなりやすいです。
本記事では、少量追加に向いたAddToArr関数と、大量追加向けの実装例をまとめて紹介します。
コピペで試せるサンプルコードも掲載しているので、すぐに実装へ活かせます。
もくじ
ReDimとReDim Preserveの違い
VBAの配列は、JavaScriptのpushのように自動で要素を追加できません。
そのため、配列に値を追加したい場合は、ReDimやReDim Preserveを使って配列のサイズを変更する必要があります。
ポイント
ReDim:配列のサイズを変更できるが、既存の値は基本的に保持されないReDim Preserve:既存の値を保持したまま配列のサイズを変更できる
配列に要素を追加したい場合は、既存の値を残したまま末尾を拡張できるReDim Preserveを使うのが基本です。
なお、ReDim Preserveは便利ですが、多次元配列などでは自由にサイズ変更できない場合があります。
まずは一次元配列で使う前提で覚えるとわかりやすいです。
【コピペOK】配列に値を追加するAddToArr関数
AddToArrは、少量の値を手軽に追加したいときに便利な関数です。
まずはシンプルに実装したい場合に向いています。
Copyをクリックするとコピーできます。
Public Function AddToArr(ByVal arr As Variant, ByVal val As Variant) As Variant '配列に値を追加 Dim reArr As Variant If IsArray(arr) Then ' 配列が存在する場合、既存の配列を拡張して値を追加 reArr = arr ReDim Preserve reArr(UBound(reArr) + 1) reArr(UBound(reArr)) = val Else ' 配列が存在しない場合、新しい配列を作成し、値を追加 ReDim reArr(0) reArr(0) = val End If AddToArr = reArrEnd FunctionAddToArr関数の使い方
第一引数のarrには値を追加したい配列を指定します。
第二引数のvalには追加したい値を指定します。
なお、arrに配列でない値が渡された場合は、新しい配列を作成し、その配列にvalの値を格納します。
各引数について
- arr (必須)
値を追加したい配列を指定します。 - val (必須)
配列に追加する値を指定します。
この方法は少量のデータ追加には便利ですが、ループ内で何度もReDim Preserveを実行すると処理が重くなりやすい点には注意が必要です。
大量のデータを扱う場合は、後述する大量追加向けの方法がおすすめです。
【サンプルコード】VBAで配列に値を追加する実例
以下のVBAコードでは、元の配列myArray = Array(1, 2, 3, 4)に5を追加しています。
実行すると、イミディエイトウィンドウに1 2 3 4 5が順番に出力されます。
Copyをクリックするとコピーできます。
Sub sample() Dim myArray As Variant Dim i As Long myArray = Array(1, 2, 3, 4) ' 配列に値を追加 myArray = AddToArr(myArray, 5) For i = LBound(myArray) To UBound(myArray) Debug.Print myArray(i) Next iEnd Sub【大量データ向け】配列に高速で追加する方法
AddToArr関数は少量のデータを追加する場合には便利ですが、ループ内で何度も実行すると、そのたびにReDim Preserveが走るため処理が重くなりやすいです。
そのため、大量のデータを追加する場合は、最初にある程度の容量を確保し、いっぱいになったときだけまとめて拡張するという方法がおすすめです。
ポイント
- 追加のたびに
ReDim Preserveしない - 容量が足りなくなったときだけ配列を拡張する
- 最後に必要な要素数だけに切り詰める
Variant配列にすることで数値・文字列のどちらにも対応できる
【コピペOK】大量追加向けの実装例
以下は、Variant配列に値を大量追加したい場合に使えるサンプルコードです。
文字列だけでなく、数値なども扱えます。
Copyをクリックするとコピーできます。
Private Sub AppendToBuffer( _ ByRef buffer() As Variant, _ ByRef capacity As Long, _ ByRef count As Long, _ ByVal value As Variant _) If capacity = 0 Then capacity = 10 ReDim buffer(0 To capacity - 1) End If If count >= capacity Then capacity = capacity * 2 ReDim Preserve buffer(0 To capacity - 1) End If buffer(count) = value count = count + 1End SubPrivate Sub TrimBuffer( _ ByRef buffer() As Variant, _ ByVal count As Long _) If count = 0 Then Erase buffer Else ReDim Preserve buffer(0 To count - 1) End IfEnd Sub【サンプルコード】Variant配列に大量の値を追加する実例
以下のコードでは、文字列と数値をVariant配列に追加しています。
最後にTrimBufferを呼ぶことで、実際に使った要素数だけに整えられます。
Copyをクリックするとコピーできます。
Sub SampleLargeVariant() Dim buffer() As Variant Dim capacity As Long Dim count As Long Dim i As Long AppendToBuffer buffer, capacity, count, "Apple" AppendToBuffer buffer, capacity, count, 100 AppendToBuffer buffer, capacity, count, "Orange" AppendToBuffer buffer, capacity, count, 200 TrimBuffer buffer, count For i = LBound(buffer) To UBound(buffer) Debug.Print buffer(i) Next iEnd Sub少量用と大量用の使い分け
- 少量の追加:
AddToArrでシンプルに実装 - 大量の追加:
AppendToBufferで効率よく追加 - 最後の調整:
TrimBufferで不要な空き領域を削除 - 汎用性:
Variant配列なら文字列・数値のどちらにも対応しやすい
数件だけ追加するならAddToArrの方が手軽です。
一方で、ループ内で何十件・何百件と追加する場合は、大量追加向けの方法の方が効率的です。
配列に値を追加するときの注意点
VBAで配列に値を追加するときは便利ですが、いくつか注意しておきたいポイントがあります。
- 大量追加では処理が重くなりやすい:
ReDim Preserveを繰り返すと配列の再確保が何度も発生します。 - Variant配列は汎用性が高い:文字列や数値をまとめて扱えますが、用途が明確なら型を固定した方が意図が伝わりやすいこともあります。
- 多次元配列にはそのまま使いにくい:今回の方法は一次元配列を前提にしています。
特に、配列に何百件も値を追加するような場面では、少量向けの関数と大量向けの方法を使い分けるのがポイントです。
高速化のポイントはReDim Preserveの実行回数を減らしている点にあります。
まとめ:配列の追加は件数に応じて使い分けよう
VBAで配列に値を動的に追加する方法は、件数や用途によって向いている実装が異なります。
少量のデータであれば、AddToArrのようなシンプルな関数で十分対応できます。
一方で、大量のデータをループ内で追加する場合は、容量をまとめて拡張する方法の方が効率的です。
- 少量の追加:
AddToArrでシンプルに実装しやすい - 大量の追加:
AppendToBufferで効率よく追加できる - 最後の調整:
TrimBufferで不要な空き領域を削除できる - 汎用性:
Variant配列なら文字列・数値のどちらにも対応しやすい
まずは少量追加ならAddToArr、ループで大量に追加するならAppendToBufferを使う、という基準で選ぶと実装しやすくなります。
