Excel VBA 逆引き集 | Preserve

Excel VBA
スポンサーリンク

Preserve の使い方

VBAで配列を扱うときに「サイズを増やしたいけど、今まで入れた値は消したくない!」という場面があります。そんなときに使うのが ReDim Preserve。初心者向けに、コード例とテンプレートをかみ砕いて説明します。


基本の考え方

  • 動的配列: Dim arr() As Variant のようにサイズ未定で宣言。
  • ReDim: サイズを後から決める。
  • ReDim Preserve: サイズを変更するときに 既存の値を残す
  • 制約: 二次元配列では「最後の次元」しか Preserve できない。

テンプレ1:一次元配列を拡張する

Sub Preserve_1D()
    Dim arr() As String
    ReDim arr(1 To 3)
    arr(1) = "A": arr(2) = "B": arr(3) = "C"

    ' 値を残したままサイズを拡張
    ReDim Preserve arr(1 To 5)
    arr(4) = "D": arr(5) = "E"

    Dim i As Long
    For i = 1 To UBound(arr)
        Debug.Print arr(i)
    Next i
End Sub
VB
  • ポイント: Preserveを付けると既存の「A,B,C」が残り、4・5番目だけ新しく空になる。

テンプレ2:サイズを縮小する

Sub Preserve_Shrink()
    Dim arr() As Long
    ReDim arr(1 To 5)
    Dim i As Long
    For i = 1 To 5: arr(i) = i * 10: Next i

    ' 値を残したまま縮小(1〜3だけ残る)
    ReDim Preserve arr(1 To 3)

    For i = 1 To UBound(arr)
        Debug.Print arr(i)
    Next i
End Sub
VB
  • ポイント: 縮小も可能。残る範囲だけ値が保持される。

テンプレ3:二次元配列での制約

Sub Preserve_2D()
    Dim arr() As Long
    ReDim arr(1 To 2, 1 To 3)
    arr(1, 1) = 100: arr(2, 3) = 200

    ' 二次元配列は最後の次元しか Preserve できない
    ReDim Preserve arr(1 To 2, 1 To 5)

    Debug.Print arr(1, 1), arr(2, 3)
End Sub
VB
  • 注意: 行数(第1次元)は変えられない。列数(第2次元)は拡張可能。

テンプレ4:配列にデータを追加していく(典型パターン)

Sub Preserve_AddData()
    Dim arr() As Variant
    Dim cnt As Long: cnt = 0

    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    Dim r As Long
    For r = 2 To lastRow
        cnt = cnt + 1
        ReDim Preserve arr(1 To cnt)
        arr(cnt) = ws.Cells(r, "A").Value
    Next r

    ' 配列の中身を確認
    For r = 1 To UBound(arr)
        Debug.Print arr(r)
    Next r
End Sub
VB
  • ポイント: 1件ずつ追加するたびに ReDim Preserve。ただし大量データでは非効率なので、まとめてサイズを確保する方が速い。

例題で練習

'例1:一次元配列を拡張して値を残す
Sub Example_Preserve1D()
    Preserve_1D
End Sub

'例2:配列を縮小して値を残す
Sub Example_PreserveShrink()
    Preserve_Shrink
End Sub

'例3:二次元配列で列数を拡張
Sub Example_Preserve2D()
    Preserve_2D
End Sub

'例4:配列にデータを追加していく
Sub Example_AddData()
    Preserve_AddData
End Sub
VB

初心者向けポイント

  • Preserveを忘れると値が消える: ReDimだけだと初期化される。
  • 二次元配列は最後の次元だけ: 行数は変えられない。列数は拡張可能。
  • 大量データでは工夫: 1件ずつ ReDim Preserve は遅い。まとめて確保して使う方が速い。
  • UBound/LBoundで範囲確認: 配列サイズを動的に扱うときは必須。
タイトルとURLをコピーしました