二次元配列AとBを行方向に(下方向)に結合したい。
ReDim Preserveは、最終次元しか拡張できない。つまり、結合可能なのは列方向のみ。そのため、下記の手順で結合する。
使い道があるかは不明。。。大量のブックを高速に集約するのに役立つかも。
・AとBを転置してAtとBtにする。
↓
列方向に結合に動的に結合(At ← Bt)
↓
結合後の配列をさらに転置して元の向きを戻す。
Sub merge_array()
Dim array_A(), array_B(), array_At(), array_Bt()
array_A = Range2Array(4, 1)
array_B = Range2Array(10, 1)
'①AとBを転置。AtとBtにする。
'配列の1次元のインデックスは1からになっている。
array_At = WorksheetFunction.Transpose(array_A)
array_Bt = WorksheetFunction.Transpose(array_B)
former_i = UBound(array_At, 2)
add_i = UBound(array_Bt, 2)
'AtとBtを列方向に結合
'AtをBtと同じサイズ分拡張。拡張したところにBt格納。
'①に合わせて「1 To ~」と宣言しないといけない
ReDim Preserve array_At(1 To UBound(array_At, 1), 1 To (UBound(array_At, 2) + add_i))
For j = 1 To UBound(array_Bt, 2)
For i = 1 To UBound(array_Bt, 1)
array_At(i, j + former_i) = array_Bt(i, j)
Next i
Next j
'結合後の配列を転置して向きを戻し、貼り付け
Cells(4, 17).Resize(UBound(array_At, 2), UBound(array_At, 1)).Value = WorksheetFunction.Transpose(array_At)
End Sub
レンジを2次元配列にする関数↓
Public Function Range2Array(begin_row As Long, begin_column As Long) As Variant
last_row = Cells(begin_row, begin_column).End(xlDown).Row '終端行
last_column = Cells(begin_row, begin_column).End(xlToRight).Column '終端列
Range2Array = Range(Cells(begin_row, begin_column), Cells(last_row, last_column))
End Function