VBAのReDimで動的配列のサイズを変更する方法をわかりやすく解説

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

ReDimの概要

動的配列管理 VBAの予約語

ReDim

概要 ReDim は、VBAの動的配列のサイズを変更するために使用されます。通常、配列のサイズは宣言時に固定されますが、ReDim を使うと実行時に変更できます。

わかりやすく説明 ReDim は、「この配列、あとからサイズを変えられるようにするよ!」という命令です。配列の要素数が実行時に決まる場合に便利です。

  • 動的配列のサイズを変更できる。
  • Dim で宣言後に ReDim を使う。
  • ReDim Preserve を使うと既存のデータを保持可能。
  • 多次元配列では最も内側の次元のみサイズ変更可能。

ReDimの基本的な使い方

ReDim を使って、実行時に配列のサイズを変更する基本的な例です。

Sub BasicReDimExample()
    Dim numbers() As Integer ' 動的配列の宣言
    
    ReDim numbers(1 To 5) ' 実行時にサイズを決定
    
    ' 配列にデータを代入
    Dim i As Integer
    For i = 1 To 5
        numbers(i) = i * 10
    Next i
    
    ' 結果を表示
    For i = 1 To 5
        Debug.Print numbers(i)
    Next i
End Sub

解説:

  • 動的配列として Dim numbers() を宣言。
  • ReDim numbers(1 To 5) でサイズを設定。
  • 実行時にサイズを変更できるため、柔軟なデータ管理が可能。

ReDim Preserve でデータを保持する

ReDim Preserve を使うと、配列のサイズ変更時に既存データを保持できます。

Sub PreserveExample()
    Dim numbers() As Integer
    Dim i As Integer
    
    ' 最初のサイズを設定
    ReDim numbers(1 To 3)
    For i = 1 To 3
        numbers(i) = i * 10
    Next i
    
    ' サイズを拡張(既存データを保持)
    ReDim Preserve numbers(1 To 5)
    numbers(4) = 40
    numbers(5) = 50
    
    ' 結果を表示
    For i = 1 To 5
        Debug.Print numbers(i)
    Next i
End Sub

解説:

  • ReDim Preserve を使うと、既存データを保持しながら配列のサイズを変更できる。
  • 新しい要素(4番目と5番目)を追加してデータを拡張可能。

ExcelでのReDimの活用例(セル範囲のデータを配列に格納)

Excelのワークシートデータを可変長の配列に格納し、処理する例です。

Sub StoreExcelData()
    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
    
    ' 結果をデバッグウィンドウに表示
    For i = 1 To lastRow
        Debug.Print arr(i)
    Next i
End Sub

解説:

  • 最終行を取得し、その行数に応じた配列を作成。
  • ワークシートのデータを動的配列に格納し、効率的に処理できる。

多次元配列のReDim Preserveの制限

多次元配列では、ReDim Preserve を使用する場合、最後の次元のみ 変更可能です。

Sub MultiDimPreserve()
    Dim arr() As Integer
    Dim i As Integer, j As Integer
    
    ' 2次元配列を初期化
    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
    
    ' 最後の次元のみ変更可能
    ReDim Preserve arr(1 To 2, 1 To 5)
End Sub

解説:

  • 多次元配列では、ReDim Preserve を使う場合、最後の次元しか変更できない。
  • ReDim Preserve arr(1 To 3, 1 To 3) のように最初の次元を変更しようとするとエラーになる。

エラーを回避する方法

ReDim の使用時にエラーが発生しないように、適切なエラーハンドリングを追加します。

Sub SafeReDim()
    Dim arr() As Integer
    On Error Resume Next
    
    ' 初期化
    ReDim arr(1 To 5)
    
    ' サイズ変更
    ReDim Preserve arr(1 To 10)
    
    If Err.Number <> 0 Then
        MsgBox "エラー発生: " & Err.Description, vbExclamation, "エラー"
        Err.Clear
    End If
End Sub

解説:

  • エラーが発生した場合、メッセージを表示し、処理を継続できるようにする。
  • エラーハンドリングを追加することで、安全に ReDim を使用可能。

ReDimの注意事項

  • ReDim は動的配列にのみ使用可能: 静的配列には適用できない。
  • ReDim Preserve は最も内側の次元のみ変更可能: 多次元配列のサイズ変更には注意が必要。
  • ReDim を繰り返すとパフォーマンスが低下: 配列のコピー処理が発生するため、大量データの場合は注意が必要。

よくある質問

Q: ReDim を静的配列に使えますか?
A: いいえ。ReDim は動的配列にのみ使用できます。
Q: ReDim Preserve ですべての次元を変更できますか?
A: いいえ。最も内側の次元(最後の次元)のみ変更できます。
Q: 配列のデータを保持せずにサイズ変更できますか?
A: はい。単に ReDim を使えば、データを保持せずにサイズ変更できます。
Q: 配列のサイズ変更を繰り返すと動作が遅くなりますか?
A: はい。ReDim Preserve は新しい配列を作成してデータをコピーするため、頻繁なサイズ変更はパフォーマンスに影響します。

まとめ

  • ReDim は、VBAの動的配列のサイズを実行時に変更するために使用される。
  • ReDim は新しい配列を作成するため、既存データは消える。
  • ReDim Preserve を使うとデータを保持しながら配列のサイズを変更できるが、最も内側の次元のみ変更可能。
  • 頻繁にサイズ変更を行うと処理速度が低下するため、大量データの処理では注意が必要。