2次元配列の1次元目の要素数を動的に変更する。
2次元配列の配列に対してRedim Preserveを利用して元のデータを残したまま配列の要素数を変更しようとした時に、1次元目の要素数を変更しようとするとエラーが発生します。
多次元配列の場合は最終の次元しか要素数を変更できないため、2次元配列の場合は2次元目の要素数のみ変更可能ということになります。
二次元配列の一次元目をRedim Preserveと同じような制御で要素数を変更したい場合は関数を作成して対応させる必要があります。
サンプルコードでは、もともと1次元目の要素数が2(0,1)しかなかった2次元配列に対して、要素数を2つ加えて、元のデータを保ったまま1次元目の要素数を4に変更しています。
作成したupd2DAryPreserve関数の引数に「元の配列データ」と「変更したい要素数」を指定することで、データを残したまま一次元目の要素数が変更された配列が戻り値として返されます。
動作確認
Windows10/Excel2016:○
Windows11/Excel2024:○
'******************************************************************************
' 2次元配列の1次元目の要素数を動的に変更
'******************************************************************************
Sub Main_upd2DAryPreserve1D()
ReDim vAryData(1, 2) As Variant
'配列にデータを設定
vAryData(0, 0) = "関東"
vAryData(0, 1) = "東京"
vAryData(0, 2) = "神奈川"
vAryData(1, 0) = "関西"
vAryData(1, 1) = "大阪"
vAryData(1, 2) = "兵庫"
Debug.Print "(変更前の要素数とデータ)"
Debug.Print "1次元目の要素数 : " & UBound(vAryData, 1)
Debug.Print "2次元目の要素数 : " & UBound(vAryData, 2)
Dim i As Long, j As Long
For i = 0 To UBound(vAryData, 1): For j = 0 To UBound(vAryData, 2)
Debug.Print "(" & i & "." & j & ")" & vAryData(i, j)
Next: Next
'データを残したまま2次元配列の1次元目の要素数を変更する
vAryData = upd2DAryPreserve(vAryData, 3)
Debug.Print vbCrLf & "(変更後の要素数とデータ)"
Debug.Print "1次元目の要素数 : " & UBound(vAryData, 1)
Debug.Print "2次元目の要素数 : " & UBound(vAryData, 2)
For i = 0 To UBound(vAryData, 1): For j = 0 To UBound(vAryData, 2)
Debug.Print "(" & i & "." & j & ")" & vAryData(i, j)
Next: Next
End Sub
'******************************************************************************
' データを残したまま2次元配列の1次元目の要素数を変更
' ※第2引数に元の配列の1次元目の要素数以下の数値を設定すると
' エラーになります。
'------------------------------------------------------------------
' 第1引数:元の配列
' 第2引数:配列の1次元目に設定したい要素数
'------------------------------------------------------------------
' 戻り値 :1次元目拡張後の配列
'******************************************************************************
Function upd2DAryPreserve(getOrgAry, getNewIdx As Long) As Variant
Dim lOrgIdxD1 As Long
Dim lOrgIdxD2 As Long
'元の配列の要素数を取得
lOrgIdxD1 = UBound(getOrgAry, 1)
lOrgIdxD2 = UBound(getOrgAry, 2)
'拡張後の配列を定義。
Dim rtnAry As Variant
ReDim rtnAry(getNewIdx, lOrgIdxD2)
'拡張後配列に元の配列の値を設定
Dim i As Long
Dim j As Long
For i = 0 To lOrgIdxD1
For j = 0 To lOrgIdxD2
rtnAry(i, j) = getOrgAry(i, j)
Next
Next
upd2DAryPreserve = rtnAry
End Function■実行結果



