【EXCEL VBA】動的配列について総まとめ(宣言、多次元、要素数、初期化)

以下記事で静的配列について説明を行いましたので、今回は動的配列について説明を行います。

動的配列の宣言

動的配列を宣言する際は、インデックス下限と上限を指定しません。しかし、そのままでは値の代入はできません。動的配列の長さが決定したらRedimでインデックス下限と上限を指定して動的配列の再宣言を行います。また、Redimは何度でも実行できるので、動的配列の縮小・拡大は何度でも可能です。

Sub sample()
    
    Dim ary() As String    ' 動的配列の宣言
    
    ' Debug.Print LBound(ary), UBound(ary)   上限下限は存在しない。エラーとなる。
    
    ReDim ary(1 To 3) As String
    
    Debug.Print LBound(ary); UBound(ary)     ' 1  3
    
    ary(1) = "1"
    ary(2) = "2"
    ary(3) = "3"
    
    Debug.Print Join(ary)   ' 1 2 3
    
    ReDim ary(0 To 4) As String    ' Redimで配列は初期化される
    
    ary(0) = "0"
    ary(4) = "4"
    
    Debug.Print Join(ary)   ' 0    4

    ReDim ary(1) As String    ' Redimで配列は初期化される

    ary(0) = "A"
    ary(1) = "B"

    Debug.Print Join(ary)   ' A B

End Sub

多次元動的配列の宣言

多次元動的配列の宣言する際は、1次元静的配列と同様にインデックス下限と上限を指定しません。Redimで多次元分のインデックス下限と上限を指定して、多次元動的配列の宣言を行います。指定方法は、多次元動的配列と同じです。なお、次元数についてもRedimで変更することが可能です。

Sub sample()
    
    Dim ary() As String
   
    ' 2次元の動的配列
    ReDim ary(2, 1 To 3) As String
    Debug.Print LBound(ary); UBound(ary); LBound(ary, 2); UBound(ary, 2) ' 0  2  1  3
    
    ' 2次元の動的配列(インデックスを変更)
    ReDim ary(4, 1) As String
    Debug.Print LBound(ary); UBound(ary); LBound(ary, 2); UBound(ary, 2) ' 0  4  0  1
    
    ' 2次元から1次元に変更
    ReDim ary(3) As String
    Debug.Print LBound(ary); UBound(ary);  ' 0  3
    
    ' 1次元から3次元に変更
    ReDim ary(6, 7, 8) As String
    Debug.Print LBound(ary); UBound(ary); LBound(ary, 2); UBound(ary, 2); LBound(ary, 3); UBound(ary, 3); ' 0  6  0  7  0  8

End Sub

動的配列のインデックス上限、下限の取得

動的配列のインデックス上限、下限の取得方法は、静的配列のインデックス上限、下限の取得方法と同じであるため省略します。多次元動的配列でも同様です。

動的配列の要素数

動的配列の要素数取得方法は、静的配列の要素数取得方法と同じであるため省略します。

動的配列の初期化

動的配列の初期化方法はいくつかあります。Redim、Redim Preserve、Eraseなどです。それぞれの違いと注意点について記載します。

Sub sample3()
    
    Dim ary() As String
   
    ReDim ary(2) As String
    ary(0) = "A"
    ary(1) = "B"
    ary(2) = "C"
    Debug.Print Join(ary)   ' A B C
    
    ' Redimだとすべて初期化される
    ReDim ary(3) As String
    ary(3) = "D"
    Debug.Print Join(ary)   '    D
    
    ' Redim Preserveだと値を残して伸縮可能(例では"D"が残っている)
    ReDim Preserve ary(4) As String
    ary(0) = "A"
    ary(1) = "B"
    ary(2) = "C"
    ary(4) = "E"
    Debug.Print Join(ary)   ' A B C D E
    
    ' Eraseで配列初期化
    Erase ary
    Debug.Print Join(ary)   ' 何も出力されない
    ' Debug.Print LBound(ary), UBound(ary); ' 上限下限は存在しない。エラーとなる。

End Sub