【PR】を含みます。

プログラミング

【VBA】配列に値を追加する方法|ReDim Preserveと大量追加を解説

配列に値を追加する方法|ReDim Preserveと大量追加を解説

VBAで配列に値を追加したいときは、ReDim Preserveを使って配列のサイズを広げるのが基本です。

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

本記事では、少量追加に向いたAddToArr関数と、大量追加向けの実装例をまとめて紹介します。

コピペで試せるサンプルコードも掲載しているので、すぐに実装へ活かせます。

ReDimとReDim Preserveの違い

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

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

ポイント

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

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

なお、ReDim Preserveは便利ですが、多次元配列などでは自由にサイズ変更できない場合があります。

まずは一次元配列で使う前提で覚えるとわかりやすいです。

【コピペOK】配列に値を追加するAddToArr関数

AddToArrは、少量の値を手軽に追加したいときに便利な関数です。

まずはシンプルに実装したい場合に向いています。

Copyをクリックするとコピーできます。

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

AddToArr関数の使い方

第一引数のarrには値を追加したい配列を指定します。

第二引数のvalには追加したい値を指定します。

なお、arrに配列でない値が渡された場合は、新しい配列を作成し、その配列にvalの値を格納します。

各引数について

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

この方法は少量のデータ追加には便利ですが、ループ内で何度もReDim Preserveを実行すると処理が重くなりやすい点には注意が必要です。

大量のデータを扱う場合は、後述する大量追加向けの方法がおすすめです。

【サンプルコード】VBAで配列に値を追加する実例

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

実行すると、イミディエイトウィンドウに1 2 3 4 5が順番に出力されます。

Copyをクリックするとコピーできます。

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

【大量データ向け】配列に高速で追加する方法

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

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

ポイント

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

【コピペOK】大量追加向けの実装例

以下は、Variant配列に値を大量追加したい場合に使えるサンプルコードです。

文字列だけでなく、数値なども扱えます。

Copyをクリックするとコピーできます。

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
    If count >= capacity Then
        capacity = capacity * 2
        ReDim Preserve buffer(0 To capacity - 1)
    End If
    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
    Else
        ReDim Preserve buffer(0 To count - 1)
    End If
End Sub

【サンプルコード】Variant配列に大量の値を追加する実例

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

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

Copyをクリックするとコピーできます。

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

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

  • 少量の追加AddToArrでシンプルに実装
  • 大量の追加AppendToBufferで効率よく追加
  • 最後の調整TrimBufferで不要な空き領域を削除
  • 汎用性Variant配列なら文字列・数値のどちらにも対応しやすい

数件だけ追加するならAddToArrの方が手軽です。

一方で、ループ内で何十件・何百件と追加する場合は、大量追加向けの方法の方が効率的です。

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

VBAで配列に値を追加するときは便利ですが、いくつか注意しておきたいポイントがあります。

  • 大量追加では処理が重くなりやすいReDim Preserveを繰り返すと配列の再確保が何度も発生します。
  • Variant配列は汎用性が高い:文字列や数値をまとめて扱えますが、用途が明確なら型を固定した方が意図が伝わりやすいこともあります。
  • 多次元配列にはそのまま使いにくい:今回の方法は一次元配列を前提にしています。

特に、配列に何百件も値を追加するような場面では、少量向けの関数と大量向けの方法を使い分けるのがポイントです。

高速化のポイントはReDim Preserveの実行回数を減らしている点にあります。

まとめ:配列の追加は件数に応じて使い分けよう

VBAで配列に値を動的に追加する方法は、件数や用途によって向いている実装が異なります。

少量のデータであれば、AddToArrのようなシンプルな関数で十分対応できます。

一方で、大量のデータをループ内で追加する場合は、容量をまとめて拡張する方法の方が効率的です。

  • 少量の追加AddToArrでシンプルに実装しやすい
  • 大量の追加AppendToBufferで効率よく追加できる
  • 最後の調整TrimBufferで不要な空き領域を削除できる
  • 汎用性Variant配列なら文字列・数値のどちらにも対応しやすい

まずは少量追加ならAddToArr、ループで大量に追加するならAppendToBufferを使う、という基準で選ぶと実装しやすくなります。

-プログラミング
-, ,