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で範囲確認: 配列サイズを動的に扱うときは必須。
