Подход с умножением матрицы
Чтобы сложить 2 одномерных массива, вы можете выполнить следующую математическую уловку и умножить массив из 4 массивов на Array(1, 1, 1, 1)
с помощью WorksheetFunction.Метод MMult , который приводит к сумме этих 4 массивов (из-за правил умножения матриц):
Option Explicit
Public Sub AddArrays()
Dim arr1 As Variant, arr2 As Variant, arr3 As Variant, arr4 As Variant
arr1 = Array(1, 3, 5, 5)
arr2 = Array(4, 0, 9, 1)
arr3 = Array(1, 2, 3, 4)
arr4 = Array(4, 3, 2, 1)
'result 10, 8, 19, 11
Dim MultArr As Variant
MultArr = Array(1, 1, 1, 1) 'a 1 for every arr variable that you sum (4 arrays = 4 ones)
Dim ResultArr As Variant
ResultArr = Application.WorksheetFunction.MMult(MultArr, Array(arr1, arr2, arr3, arr4))
'just an output example:
Debug.Print Join(ResultArr, ", ")
End Sub
Из-за правил умножения матриц это то, как он умножает матрицуMultArr
с матрицей, состоящей из arr1 … arr4
, что соответствует результату добавления arr1 … arr4
:
![enter image description here](https://i.stack.imgur.com/65kAg.png)
Так как в вашем вопросе2-мерные массивы ReDim R(1 To UBound(SR, 2), 1 To 1)
почти одномерны, их можно уменьшить до 1D-массива ReDim R(1 To UBound(SR, 2))
, заполненного как R(iSR) = SR(5, iSR)
, и вы можете легко использовать этот трюк выше для суммирования их:
.Range("B" & lastrow + 1 & ":" & "H" & lastrow + 1).Value = Application.WorksheetFunction.MMult(Array(1, 1, 1, 1), Array(R, M, O, Q))
Подход с циклом
Поскольку Крис Нейлсен отметил, что показанный выше подход примерно в 8 раз медленнее, чем цикл, я предлагаю следующее:
Поскольку в вашем вопросе двумерный массивs ReDim R(1 To UBound(SR, 2), 1 To 1)
почти одномерны, их можно уменьшить до одномерного массива, который легче обрабатывать ReDim R(1 To UBound(SR, 2))
заполненный как R(iSR) = SR(5, iSR)
И вы можете суммировать их с помощью цикла
Dim RestultArr As Variant
ReDim ResultArr(1 To UBound(SR, 2))
Dim i As Long
For i = LBound(ResultArr) To UBound(ResultArr)
ResultArr(i) = R(i) + M(i) + O(i) + Q(i)
Next i
и напишите в свой диапазон
.Range("B" & lastrow + 1 & ":" & "H" & lastrow + 1).Value = ResultArr