Excel VBA – 连接两个数组

我需要将两个数组vd和vd1连接到vdu。

ReDim vdu(1 To (UBound(vd, 1) + UBound(vd1, 1)), 1 To 1) For i = 1 To UBound(vd, 1) vdu(i, 1) = vd(i, 1) Next i For j = i To UBound(vdu, 1) vdu(j, 1) = vd1(j - i + 1, 1) Next j 

首先,我得到和“超出范围”的错误。

其次,最终我将有18个arrays,我需要join,所以我不知道这是否是join他们的最好的主意。

尝试

  ReDim vdu(LBound(vd) To UBound(vd) + UBound(vd1), 1 To 1) For i = LBound(vdu) To UBound(vdu) If i <= UBound(vd) Then vdu(i, 1) = vd(i, 1) Else vdu(i, 1) = vd1(i - UBound(vd), 1) End If Next i 

更新问题的第二部分我会把你的合并代码转换成一个函数

 Public Function MergeArrays(arr1 As Variant, arr2 As Variant) As Variant Dim i As Long Dim arr As Variant ReDim arr(LBound(arr1, 1) To UBound(arr1, 1) + UBound(arr2, 1), 1 To 1) For i = LBound(arr, 1) To UBound(arr, 1) If i <= UBound(arr1, 1) Then arr(i, 1) = arr1(i, 1) Else arr(i, 1) = arr2(i - UBound(arr1, 1), 1) End If Next i MergeArrays = arr End Function 

然后将每个数组传递给它一次一个例如

 arr = MergeArrays(vd1, vd2) arr = MergeArrays(arr, vd3) arr = MergeArrays(arr, vdx) 

你可以通过将数组存储在一个数组或字典中循环来代替

其他选项

 Public Function MergeArrays(ParamArray arrays() As Variant) As Variant Dim i As Long, j As Long, cnter As Long, UBoundArr As Long, OldUBoundArray As Long Dim arr() As Variant For j = LBound(arrays) To UBound(arrays) UBoundArr = UBoundArr + UBound(arrays(j), 1) Next j ReDim arr(1 To UBoundArr, 1 To 1) For j = LBound(arrays) To UBound(arrays) For i = LBound(arrays(j)) To UBound(arrays(j)) arr(i + OldUBoundArray, 1) = arrays(j)(i, 1) Next i OldUBoundArray = OldUBoundArray + UBound(arrays(j), 1) Next j MergeArrays = arr End Function 

这个方法使用一个ParamArray。 如果你不确定那是什么东西,但实际上你可以传递一个未指定数量的参数给函数。 因此,使用这个函数,你可以组合任意数量的数组(具有相同的形状和相同的基数,即x到x,1到1),并将它们组合在一起。 打电话

 arr = MergeArrays(vd, vd1, vd2,....,vd18) 

getMasterArray将返回一个数组,将最多60个不同的二维数组组合成一个数组。 getMasterArray也给你返回0或getMasterArray的选项。

结合数组演示

 Sub TestgetMasterArray() Dim data data = getMasterArray(False, Range("List1").Value, Range("List2").Value, Range("List3").Value, Range("List4").Value) Worksheets("Result").Range("A1").Resize(UBound(data), UBound(data, 2)).Value = data End Sub Function getMasterArray(Base0 As Boolean, ParamArray Arrays() As Variant) Dim result As Variant, v As Variant Dim Count As Long, Count2 As Long, lowBound As Integer, lOffset As Integer, x As Long, x1 As Long, y As Long For Each v In Arrays Count = Count + UBound(v) + IIf(LBound(v) = 0, 1, 0) y = UBound(v, 2) + IIf(LBound(v, 2) = 0, 1, 0) If y > Count2 Then Count2 = y Next lowBound = IIf(Base0, 0, 1) ReDim result(lowBound To Count, lowBound To Count2) For Each v In Arrays If LBound(v, 2) > LBound(result, 2) Then lOffset = -1 ElseIf LBound(v, 2) < LBound(result, 2) Then lOffset = 1 End If For x = LBound(v) To UBound(v) For y = LBound(v, 2) To UBound(v, 2) result(lowBound, y + lOffset) = v(x, y) Next lowBound = lowBound + 1 Next Next getMasterArray = result End Function 

由ockaroo.com生成的示例数据