Excel VBAで配列にあとから値を追加したいときは、ReDim Preserveで配列のサイズを広げるのが基本です(Excelに限らず、Access などVBAが使える環境で共通の書き方です)。
ただし、値を追加するたびに ReDim Preserveを実行するため、件数が多い場合は処理が重くなりやすいです。
そこで本記事では、少量追加に向いたAddToArr関数と、ループで何百件もまとめて入れる大量追加向けの実装を、コピペで試せるサンプルコード付きで紹介します。配列の宣言や要素数の数え方といった前提もあわせて整理します。
※ 本記事のサンプルは、Microsoft 365 および Excel 2016 以降の VBA を前提に書いています(2026年6月時点)。
もくじ
ReDimとReDim Preserveの違い
VBAの配列は、JavaScriptのpushのように自動で要素を追加できません。
そのため、配列に値を追加したい場合は、ReDimやReDim Preserveを使って配列のサイズを変更する必要があります。
ポイント
ReDim:配列のサイズを変更できるが、既存の値は保持されないReDim Preserve:既存の値を保持したまま配列のサイズを変更できる
配列に要素を追加したい場合は、既存の値を残したまま末尾を拡張できるReDim Preserveを使うのが基本です。
なお、ReDimでサイズを変更できるのは、要素数を指定せずに宣言した動的配列だけです。配列の宣言の仕方は次の章で説明します。
Preserveで広げられるのは最後の次元だけ。多次元配列で途中の次元を増やすことはできないPreserve使用時に下限(LBound)を変えるとエラーになる
この「最後の次元しか変えられない」という制約は地味につまずきやすく、2次元配列で行を増やそうとしてエラー(実行時エラー9)になりがちです。まずは一次元配列で使うものと考えておくと、つまずきにくくなります。詳しい仕様はReDim ステートメント(Microsoft公式リファレンス)で確認できます。
VBAで配列を宣言する方法(動的配列と静的配列)
配列にあとから値を追加するには、サイズを変えられる動的配列で宣言しておく必要があります。配列の宣言は、かっこの書き方で2種類に分かれます。
- 静的配列:
Dim arr(2)のように要素数を指定して宣言する。サイズは固定で、あとからReDimできない。 - 動的配列:
Dim arr()のようにかっこを空にして宣言する。あとからReDimでサイズを変更できる。
今回のように値を追加していく場合は、動的配列で宣言します。さらに数値も文字列もまとめて入れたいなら、Variant型にしておくと扱いやすいです。
Sub DeclareArrayExample() ' 静的配列:サイズ固定で、あとから ReDim できない Dim staticArr(2) As Long ' 動的配列:あとからサイズを変更できる Dim dynamicArr() As Variant ReDim dynamicArr(2) ' まず3要素を確保 ReDim Preserve dynamicArr(4) ' 値を残して5要素に拡張End Subなお、Array関数で作った配列を受け取るときは、Dim myArray As VariantのようにVariantで宣言します(Arrayの戻り値が配列になるためです)。次のAddToArr関数の例でもこの書き方を使います。
配列に値を追加するAddToArr関数
AddToArrは、少量の値をシンプルに追加したいときに便利な関数です。
Public Function AddToArr(ByVal arr As Variant, ByVal value As Variant) As Variant '配列に値を追加 Dim reArr As Variant If IsArray(arr) Then ' 配列が存在する場合、既存の配列を拡張して値を追加 reArr = arr ReDim Preserve reArr(LBound(reArr) To UBound(reArr) + 1) reArr(UBound(reArr)) = value Else ' 配列が存在しない場合、新しい配列を作成し、値を追加 ReDim reArr(0) reArr(0) = value End If AddToArr = reArrEnd FunctionAddToArr関数の使い方
引数は2つで、それぞれ次の値を指定します。
各引数について
- arr (必須)
値を追加したい配列を指定します。 - value (必須)
配列に追加する値を指定します。
arrに配列でない値を渡したときは、新しい配列を作ってそこにvalueを格納します。
AddToArrが手軽なのは数件程度の追加までです。ループで何百件も追加するときは、効率的な書き方をこのあと紹介します。
VBAで配列に値を追加する実例
以下のVBAコードでは、元の配列myArray = Array(1, 2, 3, 4)に5を追加しています。
実行すると、イミディエイトウィンドウに各要素が1行ずつ出力されます。
※ このSampleはAddToArrを呼び出しています。先ほどのAddToArr関数と同じ標準モジュールに貼り付けてから実行してください。AddToArrが無いまま実行すると、「Sub または Function が定義されていません」というエラーになります。
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実行結果(イミディエイトウィンドウ)は次のとおりです。末尾に5が追加されているのが分かります。
1 2 3 4 5
配列の要素数を調べる方法(UBound・LBound)
値を追加したあとは、UBound(上限の添字)とLBound(下限の添字)で要素数を確認できます。
配列の下限は0のことが多いですが、Option Baseや宣言の仕方によっては1から始まることもあります。そのため、下限も計算に含めたUBound - LBound + 1で求めれば、下限が0でも1でも正しく数えられます。
Sub ShowArrayCount() Dim myArray As Variant myArray = Array(1, 2, 3, 4) myArray = AddToArr(myArray, 5) ' 要素数を求める(結果は 5) Debug.Print UBound(myArray) - LBound(myArray) + 1End Subなお、まだ一度もReDimしていない動的配列にUBoundを使うと「実行時エラー9」になります。要素を追加しながら件数を管理したいときは、UBoundに頼らず自前のカウンター変数を用意しておくと安全です(後述の大量追加の例で使っています)。
大量のデータを配列に高速で追加する方法
AddToArr関数は少量のデータを追加する場合には便利ですが、ループ内で何度も実行すると、そのたびにReDim Preserveが走るため処理が重くなりやすいです。
そのため、大量のデータを追加する場合は、最初にある程度の容量を確保し、いっぱいになったときだけまとめて拡張するという方法がおすすめです。
ポイント
- 追加のたびに
ReDim Preserveしない - 容量が足りなくなったときだけ配列を拡張する
- 最後に必要な要素数だけに切り詰める
Variant配列にすることで数値・文字列のどちらにも対応できる
大量追加向けの実装例
以下は、Variant配列に大量の値を追加したいときに使えるサンプルコードです。文字列でも数値でも扱えます。
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 ' 容量がいっぱいになったら2倍に広げる If count >= capacity Then capacity = capacity * 2 ReDim Preserve buffer(0 To capacity - 1) End If ' 末尾に値を入れて、件数を1つ増やす buffer(count) = value count = count + 1End SubPrivate Sub TrimBuffer( _ ByRef buffer() As Variant, _ ByVal count As Long _) ' 実際に使った件数だけに切り詰める If count = 0 Then Erase buffer ' 1件もなければ配列を空にする Else ReDim Preserve buffer(0 To count - 1) End IfEnd SubVariant配列に大量の値を追加する実例
以下のコードでは、文字列と数値をVariant配列に追加しています。
最後にTrimBufferを呼ぶことで、実際に使った要素数だけに整えられます。
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実行結果(イミディエイトウィンドウ)は次のとおりです。文字列と数値が混在したまま、追加した順に並びます。
Apple 100 Orange 200
少量用と大量用の使い分け
2つの方法は、追加する件数で選ぶと迷いません。
| 追加する件数 | おすすめ | ポイント |
|---|---|---|
| 数件程度 | AddToArr | 1関数だけでシンプルに書ける |
| 何十〜何百件 | AppendToBuffer+TrimBuffer | 容量をまとめて確保し、最後に切り詰める |
配列に値を追加するときの注意点
VBAで配列に値を追加できると便利ですが、いくつか注意しておきたいポイントがあります。
- 大量追加では処理が重くなりやすい:
ReDim Preserveを繰り返すと配列の再確保が何度も発生します。 - Variant配列は汎用性が高い:文字列や数値をまとめて扱えますが、用途が明確なら型を固定した方が意図が伝わりやすいこともあります。
- 多次元配列にはそのまま使えない:今回の方法は一次元配列を前提にしています。
VBAの配列追加でよくある質問
Q. ReDimとReDim Preserveはどちらを使えばいいですか?
A. すでに入っている値を残したまま要素を増やしたいならReDim Preserveです。PreserveなしのReDimはサイズ変更と同時に中身がリセットされるので、配列を作り直すとき以外はPreserve付きを使います。
Q. 配列の先頭に値を追加するにはどうすればいいですか?
A. ReDim Preserveは末尾しか拡張できないため、先頭に入れるには一度サイズを広げてから既存の値を1つずつ後ろへずらし、空いた0番目に値を入れます。頻繁に先頭へ追加するなら、Collectionなど別のデータ構造を検討したほうが手軽な場合もあります。
Q. 2次元配列に行を追加することはできますか?
A. ReDim Preserveで広げられるのは最後の次元だけなので、arr(行, 列)の形では行(先頭の次元)を増やせません。行を増やしたい場合は配列の持ち方をarr(列, 行)と入れ替えて最後の次元を行にする、という工夫が必要です。
Q. ループで大量に追加すると遅いのですが、速くする方法はありますか?
A. 追加のたびにReDim Preserveを呼ぶと、そのつど配列の作り直しが発生して遅くなります。本記事のAppendToBufferのように、最初にまとめて容量を確保し、足りなくなったときだけ拡張する方式にするとReDimの回数を減らせます。
配列に値を入れてループで1件ずつ処理する基本は、以下の記事でまとめています。
-

【VBA】ループ処理の基本と繰り返し処理の使い方
VBA(Visual Basic for Applications)では、同じ処理を繰り返す際にループ処理を使用します。 ループを適切に活用することで、効率的なコードを書くことができます。 本記事では ...
-

【Excel VBA】Range.Valueが配列にならない理由と2次元配列に変換する方法
Excel VBAでRangeオブジェクトから配列を取得する際、1セル(1行1列)のみを指定すると、2次元配列ではなく単一の値として取得されてしまいます。 この記事では、「Range.Valueが配列 ...
まとめ:配列の追加は件数に応じて使い分けよう
VBAで配列に値を動的に追加する方法は、件数や用途によって向いている実装が変わります。最後にポイントを整理します。
- 少量の追加:
AddToArrでシンプルに実装しやすい - 大量の追加:
AppendToBufferで効率よく追加できる - 最後の調整:
TrimBufferで不要な空き領域を削除できる - 汎用性:
Variant配列なら文字列・数値のどちらにも対応しやすい
まずは少量追加ならAddToArr、ループで大量に追加するならAppendToBufferを使う、という基準で選ぶと実装しやすくなります。



もみじ
現役フリーランスWebエンジニア。フロントエンド開発を中心に、Web制作、WordPress、業務効率化ツール開発、PHPを用いた機能改修に携わってきました。社内SEとして業務ツール開発や運用保守を担当した経験もあります。
実務や学習を通じて得た知見をもとに、初心者がつまずきやすいポイントや、現場で役立つ考え方をわかりやすく発信しています。
詳しいプロフィールはこちら