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 массивов, которые мне нужно будет присоединиться, поэтому я не знаю, является ли это лучшей идеей для их присоединения.

попробуйте

  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 

И затем передайте каждый массив к нему 1 за раз, например

 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 to x, от 1 до 1), и она будет сочетать их. Назовите

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

getMasterArray вернет массив, который объединяет до 60 различных 2-мерных массивов в один. getMasterArray также дает вам возможность вернуть 0 или массив.

Объединить массивы

 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

Interesting Posts
Давайте будем гением компьютера.