動的配列
「配列のサイズを最初から決められない」「途中で増やしたい」——そんなときに便利なのが 動的配列。初心者がつまずきやすいポイントを、コード例とテンプレートでかみ砕いて説明します。
基本の考え方
- 固定配列:
Dim arr(1 To 10)のように最初からサイズを決める。 - 動的配列:
Dim arr() As Variantのようにサイズ未定で宣言。 - ReDim: 動的配列に後からサイズを与える。
- ReDim Preserve: 値を残したままサイズを変更する。
テンプレ1:動的配列にサイズを与える
Sub DynamicArray_Basic()
Dim arr() As String ' サイズ未定の配列
' サイズを後から決める(5要素)
ReDim arr(1 To 5)
Dim i As Long
For i = 1 To 5
arr(i) = "要素" & i
Debug.Print arr(i)
Next i
End Sub
VB- ポイント:
Dim arr()だけでは使えない。必ずReDimでサイズを決める。
テンプレ2:サイズを変更する(値は消える)
Sub DynamicArray_Resize()
Dim arr() As Long
ReDim arr(1 To 3)
arr(1) = 10: arr(2) = 20: arr(3) = 30
' サイズを変更(値は消える)
ReDim arr(1 To 5)
Debug.Print "要素数:" & UBound(arr)
End Sub
VB- 注意:
ReDimだけだと中身は消える。新しいサイズで初期化される。
テンプレ3:値を残したままサイズ変更(Preserve)
Sub DynamicArray_Preserve()
Dim arr() As Long
ReDim arr(1 To 3)
arr(1) = 10: arr(2) = 20: arr(3) = 30
' 値を残したままサイズを拡張
ReDim Preserve arr(1 To 5)
arr(4) = 40: arr(5) = 50
Dim i As Long
For i = 1 To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
VB- ポイント:
Preserveを付けると既存の値が残る。新しい要素だけ空になる。
テンプレ4:二次元配列の動的サイズ変更
Sub DynamicArray_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- 注意: 二次元配列で
Preserveを使えるのは「最後の次元」だけ。
→ 行数は変えられないが、列数は増やせる。
テンプレ5:配列にデータを追加していく(典型パターン)
Sub DynamicArray_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_Basic()
DynamicArray_Basic
End Sub
'例2:サイズ変更で値が消えることを確認
Sub Example_Resize()
DynamicArray_Resize
End Sub
'例3:Preserveで値を残したまま拡張
Sub Example_Preserve()
DynamicArray_Preserve
End Sub
'例4:二次元配列でPreserveを使う
Sub Example_2D()
DynamicArray_2D
End Sub
'例5:シートのA列を配列に追加していく
Sub Example_AddData()
DynamicArray_AddData
End Sub
VB初心者向けポイント
- 動的配列は必ずReDim:
Dim arr()だけでは使えない。 - Preserveを忘れると値が消える: 拡張時は必ず
ReDim Preserve。 - 二次元配列は最後の次元だけ拡張可能: 行数は固定、列数は増やせる。
- 大量データでは工夫: 1件ずつ
ReDim Preserveは遅い。まとめて確保して使う方が速い。 - UBound/LBoundで範囲確認: 配列サイズを動的に扱うときは必須。
