動的配列の使い方

プログラミング

動的配列とは

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

 動的配列では、初期化関連の 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 vArr(5)    '新規で 5要素の配列を作る
 ReDim Preserve vArr(6)   '1~5 までの要素を残しつつ6番目の要素を用意する

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

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

要素インデックスの最小値、最大値

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

    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

 UBound(配列名) + 1としているのは、最初のインデックスが0の時です。「Option Base 1」を指定している時は、最初のインデックスが 1 になるので、UBOUNDが要素数になります。注意してください。

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つずつ要素を追加しながら値を代入していく例です。 ※2025.4.17 更新

Sub myAddArray()
    Dim vArr()
    
    '要素を追加
    Dim i As Long
    For i = 0 To 5
        If (Not vArr) = -1 Then
            ReDim vArr(0)
            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

(Not vArr) = -1 の部分が意味不明と思われるかもしれませんが、動的配列 vArr がエリア確保されていない場合に -1 (True)が返るようになります。同じ意味で、(Not Not vArr) = 0 という書き方もできます。

 結果は以下のようになります。

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