エクセルVBAで使うコードの備忘録。2次元のVariant配列を結合するコード。列方向(横方向)への結合と行方向(縦方向)への結合の両方をご紹介します。比較的簡単に実現できます。
列方向に配列を結合
まずは、二つの2次元配列を列方向に結合する場合について。列方向というのは、エクセルのワークシートで言うと横側のことを言っています。イメージは、2次元の配列をエクセルシート上でどんどん右側につなげていくイメージです(下図参照)。
引数として結合する2次元配列(vArray1とvArrray2)を指定します。結合後の配列サイズは、行はサイズが大きいもの、列は2つの配列の足し合わせた値、になります。
列方向に2次元配列を結合
'--- 2つのVariant配列を結合する(列方向) ---'
Private Function MergeVariantArraysCol(vArray1 As Variant, vArray2 As Variant) As Variant
'結合する配列のサイズ
Dim vArray1_row As Long
Dim vArray1_col As Long
Dim vArray2_row As Long
Dim vArray2_col As Long
vArray1_row = UBound(vArray1, 1)
vArray1_col = UBound(vArray1, 2)
vArray2_row = UBound(vArray2, 1)
vArray2_col = UBound(vArray2, 2)
'結合後の配列のサイズ
Dim newArray_row As Long
Dim newArray_col As Long
newArray_row = Application.WorksheetFunction.Max(vArray1_row, vArray2_row)
newArray_col = vArray1_col + vArray2_col
'結合後の配列
Dim newArray As Variant
ReDim newArray(1 To newArray_row, 1 To newArray_col)
'配列を結合する
Dim i As Long
Dim j As Long
For j = 1 To newArray_col
If (j <= vArray1_col) Then
For i = 1 To newArray_row
If (i <= vArray1_row) Then
newArray(i, j) = vArray1(i, j)
Else
newArray(i, j) = Empty
End If
Next i
Else
For i = 1 To newArray_row
If (i <= vArray2_row) Then
newArray(i, j) = vArray2(i, j - vArray1_col)
Else
newArray(i, j) = Empty
End If
Next i
End If
Next j
MergeVariantArraysCol = newArray
End Function
行方向に配列を結合
次は、二つの2次元配列を行方向に結合する場合について。行方向というのは、エクセルのワークシートで言うと下側のことを言っています。イメージは、2次元の配列をエクセルシート上でどんどん下側につなげていくイメージです(下図参照)。
引数として、列方向と同様に結合する2次元配列(vArray1とvArrray2)を指定します。結合後の配列サイズは、行は2つの配列の足し合わせた値、列はサイズが大きいもの、になります。
行方向に2次元配列を結合
'--- 2つのVariant配列を結合する(行方向) ---'
Private Function MergeVariantArraysRow(vArray1 As Variant, vArray2 As Variant) As Variant
'結合する配列のサイズ
Dim vArray1_row As Long
Dim vArray1_col As Long
Dim vArray2_row As Long
Dim vArray2_col As Long
vArray1_row = UBound(vArray1, 1)
vArray1_col = UBound(vArray1, 2)
vArray2_row = UBound(vArray2, 1)
vArray2_col = UBound(vArray2, 2)
'結合後の配列のサイズ
Dim newArray_row As Long
Dim newArray_col As Long
newArray_row = vArray1_row + vArray2_row
newArray_col = Application.WorksheetFunction.Max(vArray1_col, vArray2_col)
'結合後の配列
Dim newArray As Variant
ReDim newArray(1 To newArray_row, 1 To newArray_col)
'配列を結合する
Dim i As Long
Dim j As Long
For j = 1 To newArray_row
If (j <= vArray1_row) Then
For i = 1 To newArray_col
If (i <= vArray1_col) Then
newArray(j, i) = vArray1(j, i)
Else
newArray(j, i) = Empty
End If
Next i
Else
For i = 1 To newArray_col
If (i <= vArray2_col) Then
newArray(j, i) = vArray2(j - vArray1_row, i)
Else
newArray(j, i) = Empty
End If
Next i
End If
Next j
MergeVariantArraysRow = newArray
End Function