【PR】を含みます。

プログラミング

【VBA】配列に値を追加する方法|ReDim Preserveをコード付きで解説

VBA 配列に値を追加する方法

Excel VBAで配列にあとから値を追加したいときは、ReDim Preserveで配列のサイズを広げるのが基本です(Excelに限らず、Access などVBAが使える環境で共通の書き方です)。

ただし、値を追加するたびに ReDim Preserveを実行するため、件数が多い場合は処理が重くなりやすいです。

そこで本記事では、少量追加に向いたAddToArr関数と、ループで何百件もまとめて入れる大量追加向けの実装を、コピペで試せるサンプルコード付きで紹介します。配列の宣言や要素数の数え方といった前提もあわせて整理します。

※ 本記事のサンプルは、Microsoft 365 および Excel 2016 以降の VBA を前提に書いています(2026年6月時点)。

ReDimとReDim Preserveの違い

VBAの配列は、JavaScriptのpushのように自動で要素を追加できません。

そのため、配列に値を追加したい場合は、ReDimReDim Preserveを使って配列のサイズを変更する必要があります。

ポイント

  • ReDim:配列のサイズを変更できるが、既存の値は保持されない
  • ReDim Preserve:既存の値を保持したまま配列のサイズを変更できる

配列に要素を追加したい場合は、既存の値を残したまま末尾を拡張できるReDim Preserveを使うのが基本です。

なお、ReDimでサイズを変更できるのは、要素数を指定せずに宣言した動的配列だけです。配列の宣言の仕方は次の章で説明します。

  • Preserveで広げられるのは最後の次元だけ。多次元配列で途中の次元を増やすことはできない
  • Preserve使用時に下限(LBound)を変えるとエラーになる

この「最後の次元しか変えられない」という制約は地味につまずきやすく、2次元配列で行を増やそうとしてエラー(実行時エラー9)になりがちです。まずは一次元配列で使うものと考えておくと、つまずきにくくなります。詳しい仕様はReDim ステートメント(Microsoft公式リファレンス)で確認できます。

VBAで配列を宣言する方法(動的配列と静的配列)

配列にあとから値を追加するには、サイズを変えられる動的配列で宣言しておく必要があります。配列の宣言は、かっこの書き方で2種類に分かれます。

  • 静的配列Dim arr(2)のように要素数を指定して宣言する。サイズは固定で、あとからReDimできない。
  • 動的配列Dim arr()のようにかっこを空にして宣言する。あとからReDimでサイズを変更できる。

今回のように値を追加していく場合は、動的配列で宣言します。さらに数値も文字列もまとめて入れたいなら、Variant型にしておくと扱いやすいです。

VBA
Copy
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は、少量の値をシンプルに追加したいときに便利な関数です。

VBA
Copy
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 = reArr
End Function

AddToArr関数の使い方

引数は2つで、それぞれ次の値を指定します。

各引数について

  1. arr (必須)
    値を追加したい配列を指定します。
  2. value (必須)
    配列に追加する値を指定します。

arrに配列でない値を渡したときは、新しい配列を作ってそこにvalueを格納します。

AddToArrが手軽なのは数件程度の追加までです。ループで何百件も追加するときは、効率的な書き方をこのあと紹介します。

VBAで配列に値を追加する実例

以下のVBAコードでは、元の配列myArray = Array(1, 2, 3, 4)5を追加しています。

実行すると、イミディエイトウィンドウに各要素が1行ずつ出力されます。

※ このSampleAddToArrを呼び出しています。先ほどのAddToArr関数と同じ標準モジュールに貼り付けてから実行してください。AddToArrが無いまま実行すると、「Sub または Function が定義されていません」というエラーになります。

VBA
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 i
End Sub

実行結果(イミディエイトウィンドウ)は次のとおりです。末尾に5が追加されているのが分かります。

1
2
3
4
5

配列の要素数を調べる方法(UBound・LBound)

値を追加したあとは、UBound(上限の添字)とLBound(下限の添字)で要素数を確認できます。

配列の下限は0のことが多いですが、Option Baseや宣言の仕方によっては1から始まることもあります。そのため、下限も計算に含めたUBound - LBound + 1で求めれば、下限が0でも1でも正しく数えられます。

VBA
Copy
Sub ShowArrayCount()
    Dim myArray As Variant
    myArray = Array(1, 2, 3, 4)
    myArray = AddToArr(myArray, 5)
    ' 要素数を求める(結果は 5)
    Debug.Print UBound(myArray) - LBound(myArray) + 1
End Sub

なお、まだ一度もReDimしていない動的配列にUBoundを使うと「実行時エラー9」になります。要素を追加しながら件数を管理したいときは、UBoundに頼らず自前のカウンター変数を用意しておくと安全です(後述の大量追加の例で使っています)。

大量のデータを配列に高速で追加する方法

AddToArr関数は少量のデータを追加する場合には便利ですが、ループ内で何度も実行すると、そのたびにReDim Preserveが走るため処理が重くなりやすいです。

そのため、大量のデータを追加する場合は、最初にある程度の容量を確保し、いっぱいになったときだけまとめて拡張するという方法がおすすめです。

ポイント

  • 追加のたびにReDim Preserveしない
  • 容量が足りなくなったときだけ配列を拡張する
  • 最後に必要な要素数だけに切り詰める
  • Variant配列にすることで数値・文字列のどちらにも対応できる

大量追加向けの実装例

以下は、Variant配列に大量の値を追加したいときに使えるサンプルコードです。文字列でも数値でも扱えます。

VBA
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
    ' 容量がいっぱいになったら2倍に広げる
    If count >= capacity Then
        capacity = capacity * 2
        ReDim Preserve buffer(0 To capacity - 1)
    End If
    ' 末尾に値を入れて、件数を1つ増やす
    buffer(count) = value
    count = count + 1
End Sub
Private 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 If
End Sub

Variant配列に大量の値を追加する実例

以下のコードでは、文字列と数値をVariant配列に追加しています。

最後にTrimBufferを呼ぶことで、実際に使った要素数だけに整えられます。

VBA
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 i
End Sub

実行結果(イミディエイトウィンドウ)は次のとおりです。文字列と数値が混在したまま、追加した順に並びます。

Apple
100
Orange
200

少量用と大量用の使い分け

2つの方法は、追加する件数で選ぶと迷いません。

追加する件数おすすめポイント
数件程度AddToArr1関数だけでシンプルに書ける
何十〜何百件AppendToBufferTrimBuffer容量をまとめて確保し、最後に切り詰める

配列に値を追加するときの注意点

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】ループ処理の基本と繰り返し処理の使い方

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

あわせて読む
Excel VBA Range.Valueが配列にならない理由と2次元配列に変換する方法

【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として業務ツール開発や運用保守を担当した経験もあります。

実務や学習を通じて得た知見をもとに、初心者がつまずきやすいポイントや、現場で役立つ考え方をわかりやすく発信しています。

詳しいプロフィールはこちら

-プログラミング
-, ,