動的配列の使い方

中級VBA

動的配列の使い方

 動的配列とは、プログラミングの最中で要素数を変化させられる配列を意味します。
 静的配列では、あらかじめ要素数を指定して宣言し、途中から大きさを変化せることはできません。
 
 配列を使いたいけれども、要素数が特定できないようなケースで用いられます。
 少々癖がありますので、ポイントを押さえて見ていきたいと思います。

 動的配列では、初期化関連の ReDimPreserveErase。そして配列要素を示す UBOUNDLBOUNDを押さえておけば良いでしょう。

動的配列の宣言

 動的配列の宣言では、要素数を指定しない形で宣言します。

    'Dim vArr() As Variant
    Dim vArr()              'Variant型
    
    Dim lArr() As Long      '整数
    Dim sArr() As String    '文字列
    Dim oArr() As Range     'オブジェクトの例

  Dim 変数名 As 変数型

 という形で宣言します。

要素数指定 ReDim

 ReDimでは、それまでの配列の情報は無くなってしまうため、1つずつ要素を追加していくような処理には向いていません。
 それまでの配列に新たに要素数を追加するには、ReDim Preserveと宣言します。

 ReDim Preserve vArr(2)

 尚、ReDim Preserve で前よりも小さい要素数で宣言し直すと、少なくなった分の値はなくなります。

ReDim vArr(5)
ReDim Preserve vArr(2)   ’インデックス3、4、5の値は消滅

要素の最小値、最大値

 動的配列では、要素数が変化しますので要素数を特定するためにUBOUND関数がよく使われます。
 UBOUND関数は静的配列でも使えます。
 
 また、最小値はLBOUND関数を使います。
 初期状態では最小値は 0 なのですが、「Option Base 1」を宣言する事で配列のインデックスを1始まりにする事もできてしまいます。
 LBOUND関数を使えば、このような設定を考慮して最小値を得ることができます。

    ReDim vArr(5)
    
    Dim i As Long
    For i = LBound(vArr) To UBound(vArr)
        vArr(i) = i + 10
    Next i

 上記のようにFor文の最小値、最大値を指定する時に便利です。

 ※「Option Base 1」を宣言した場合としない場合では配列の0番目のあるなしで要素数が変化しますので注意が必要です。

配列の要素数

 配列の要素数を取得できる関数は用意されていません。
 代わりにUBOUND関数を使って表現する事が多いです。

    ReDim vArr(5)
    MsgBox "aArrの要素数=" & UBound(vArr) + 1

 ただし、最大のインデックスから値を得ているため「Option Base 1」を指定していると要素数が変化しますので注意が必要です。

Eraseを使った初期化

 Eraseステートメントを使うと、要素の無い配列として初期化できます。
 この後にUBound関数などを使用するとエラーとなります。

    ReDim vArr(5)
    
    Erase vArr
    
    'MsgBox "vArrの要素数=" & UBound(vArr) + 1  ///ここでエラー!

要素の初期値は型によって異なる

 ReDimなどで要素数を定義した場合、配列内部の値は宣言した型によって異なります。

    型
数値配列0
文字列配列長さ0(ゼロ)の文字列
オブジェクト配列Nothing
バリアント配列Empty

 以下に例を挙げておきます。

    Dim oArr() As Range     '///オブジェクト型の例
    ReDim oArr(0)
    If oArr(0) Is Nothing Then
        Set oArr(0) = Range("A1")
    End If


    Dim vArr()              '///Variant型の例
    ReDim vArr(0)

    If IsNothing(vArr(0)) Then
        vArr(0) = "Hello"
    End If

 配列要素が空の場合の値はVBEのローカルウインドウで確認できます。

動的配列で1つずつ要素を追加するサンプル

 動的配列で1つずつ要素を追加しながら値を代入していく例です。

Sub myAddArray()
    Dim vArr()
    ReDim vArr(0)
    
    '要素を追加
    Dim i As Long
    For i = 0 To 5
        If IsEmpty(vArr(0)) Then
            vArr(0) = "item0"
        Else
            ReDim Preserve vArr(UBound(vArr) + 1)
            vArr(UBound(vArr)) = "item" & i
        End If
    Next i
    
    '表示
    Dim str As String
    str = ""
    For i = 0 To UBound(vArr)
        str = str & "[" & i & "]=" & vArr(i) & vbCrLf
    Next i
    str = str & "配列の要素数 = " & UBound(vArr) + 1 & vbCrLf
    MsgBox str
End Sub

 配列のによって黄色の下線の部分を変えないといけないので注意してください。

タイトルとURLをコピーしました