Excel VBA 逆引き集 | 動的配列

Excel VBA
スポンサーリンク

動的配列

「配列のサイズを最初から決められない」「途中で増やしたい」——そんなときに便利なのが 動的配列。初心者がつまずきやすいポイントを、コード例とテンプレートでかみ砕いて説明します。


基本の考え方

  • 固定配列: 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で範囲確認: 配列サイズを動的に扱うときは必須。
タイトルとURLをコピーしました