VBAのPreserveで動的配列のデータを保持する方法をわかりやすく解説

スポンサーリンク
スポンサーリンク

Preserveの概要

動的配列 VBAの予約語

Preserve

概要 Preserve は、VBAで動的配列のサイズを変更する際に、既存のデータを保持するために使用されます。

わかりやすく説明 Preserve は、「配列のサイズを変えるけど、今入っているデータは消さないで!」という命令です。通常、配列のサイズを変更するとデータは消えますが、Preserve を使うとそのまま保持できます。

  • 動的配列(ReDim でサイズ変更する配列)に使用可能。
  • 既存のデータを保持したまま、配列のサイズを変更できる。
  • 最も内側の次元(最後のインデックス) のみサイズ変更できる。
  • 多次元配列では、最も右の次元以外は変更できない。

Preserveの基本的な使い方

Preserve を使って、配列のデータを保持しながらサイズを変更する基本的な例です。

Sub PreserveExample()
    Dim arr() As Integer
    Dim i As Integer
    
    ' 配列の初期化(3要素)
    ReDim arr(1 To 3)
    For i = 1 To 3
        arr(i) = i * 10
    Next i
    
    ' 配列サイズを変更(5要素に拡張)
    ReDim Preserve arr(1 To 5)
    arr(4) = 40
    arr(5) = 50
    
    ' 結果を表示
    For i = 1 To 5
        Debug.Print arr(i)
    Next i
End Sub

解説:

  • 最初に 3 要素の配列を作成し、データを格納。
  • ReDim Preserve arr(1 To 5) で 5 要素に拡張し、既存データを保持。
  • 4番目と5番目の要素に新しい値を追加。

ExcelでのPreserveの活用例(動的配列でセルデータを格納)

Excelのセルデータを動的配列に格納し、後からデータを追加する例です。

Sub StoreCellValues()
    Dim arr() As String
    Dim lastRow As Integer, i As Integer
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    ReDim arr(1 To lastRow)
    
    ' A列のデータを配列に格納
    For i = 1 To lastRow
        arr(i) = Cells(i, 1).Value
    Next i
    
    ' 配列を拡張して新しいデータを追加
    ReDim Preserve arr(1 To lastRow + 1)
    arr(lastRow + 1) = "追加データ"
    
    ' A列に再度書き戻す
    For i = 1 To UBound(arr)
        Cells(i, 2).Value = arr(i)
    Next i
End Sub

解説:

  • A列のデータを動的配列に格納。
  • ReDim Preserve で配列サイズを拡張し、新しいデータを追加。
  • B列に拡張後のデータを書き戻す。

多次元配列でのPreserveの制限

Preserve を使う場合、多次元配列では最も内側の次元のみサイズ変更が可能です。

Sub MultiDimPreserve()
    Dim arr() As Integer
    Dim i As Integer, j As Integer
    
    ' 2次元配列(1次元目は変更不可)
    ReDim arr(1 To 2, 1 To 3)
    
    ' データを格納
    For i = 1 To 2
        For j = 1 To 3
            arr(i, j) = i * j
        Next j
    Next i
    
    ' 次元1を変更しようとするとエラーになる
    ' ReDim Preserve arr(1 To 3, 1 To 3) ' ←エラー

    ' 次元2の拡張のみ可能
    ReDim Preserve arr(1 To 2, 1 To 5)
End Sub

解説:

  • 2次元配列を作成し、データを格納。
  • ReDim Preserve arr(1 To 3, 1 To 3) はエラー(最も内側の次元以外は変更不可)。
  • ReDim Preserve arr(1 To 2, 1 To 5) のように、最後の次元のみ変更可能。

エラーを回避する方法

Preserve を使う際に、適切なサイズ変更をしないとエラーが発生するため、エラーハンドリングを追加します。

Sub SafePreserve()
    Dim arr() As Integer
    Dim i As Integer
    
    On Error Resume Next
    ReDim Preserve arr(1 To 5)
    
    If Err.Number <> 0 Then
        MsgBox "エラー発生: " & Err.Description, vbExclamation, "エラー"
        Err.Clear
    Else
        MsgBox "配列を正常に拡張しました。"
    End If
End Sub

解説:

  • On Error Resume Next でエラーを無視し、発生時にメッセージを表示。
  • 適切なエラーハンドリングで処理が止まらないようにする。

Preserveの注意事項

  • Preserve は最後の次元のみ変更可能: 多次元配列では最も内側の次元以外は変更できない。
  • サイズ変更すると処理速度が低下する: Preserve は新しい配列を作成し、データをコピーするため、大きな配列で頻繁に使用するとパフォーマンスが低下する。
  • データを保持する際の順番に注意: Preserve でサイズを縮小すると、削られた部分のデータは消える。

よくある質問

Q: Preserve なしで ReDim を使うとどうなりますか?
A: 既存の配列のデータはすべて失われ、新しい配列が作成されます。
Q: 配列のサイズを小さくすることはできますか?
A: はい。ただし、縮小された範囲のデータは消去されます。
Q: 多次元配列の最初の次元を変更できますか?
A: いいえ。Preserve では最後の次元(最も右の次元)のみ変更できます。
Q: 配列のサイズ変更を繰り返すと動作が遅くなりますか?
A: はい。Preserve は新しい配列を作成し、データをコピーするため、大量のデータで頻繁に変更すると処理速度が低下します。

まとめ

  • Preserve を使うと、配列のサイズ変更時に既存データを保持できる。
  • 最も内側の次元のみ変更可能。
  • サイズ変更を頻繁に行うと処理速度が低下するため注意が必要。
  • データ保持が必要な場合に適切に活用する。