Подход с использованием функции MMULT()
- Если вы хотите умножить, например, {10,1,30} на единственный коэффициент , вы 'пришлось бы повторить множитель во втором аргументе в другом массиве:
Dim a = Array(10, 1, 30)
b = WorksheetFunction.MMult(a, Application.Transpose(Array(1, 1, 1)))
Debug.Print b(1) ' 41
Также можно было бы определить отдельный массив с соответствующими
индивидуальными факторами для каждого базового элемента:
Dim a = Array(10, 1, 30)
Dim b: b = WorksheetFunction.MMult(a, Application.Transpose(Array(1, 1.5, 1)))
Debug.Print b(1) ' 41.5
A гибкая функция , содержащая обе версии (для любых массивов на основе нуля или 1, заполнение отсутствующих факторов в версии 2.
нулевыми значениями по умолчанию ) может быть:
Function SumPro(a, factor, Optional missingFactor As Long = 0)
'Purp: sum products of array items multiplied by a) a single value or b) a set of factors in a 1-dim array
'Note: assumes "flat" 1-dim array(s)
' fills up missing factors with zero values by default (missingFactor = 0)
Dim n As Long: n = UBound(a) - LBound(a) + 1 ' items count independant from base start
Dim b: ReDim b(1 To n, 1 To 1) ' provide for sufficient 1-based factor items
Dim i As Long ' counter
If Not IsArray(factor) Then ' a) := single value
For i = 1 To UBound(b): b(i, 1) = factor: Next ' insert as many factors as array items
Else ' b) := already a factor array
For i = LBound(factor) To UBound(factor)
b(i - LBound(factor) + 1, 1) = factor(i) ' collect existing factors
Next
For i = i - LBound(factor) + 1 To UBound(b)
b(i, 1) = missingFactor ' complete missing factor items
Next
End If
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' calculate SumProduct (without Evaluate)
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Dim tmp: tmp = Application.MMult(a, b) ' execute MMULT() function
' return function result
SumPro = tmp(1) ' return result
End Function
Пример вызова
Dim a: a = Array(10, 1, 30) ' base values
Dim b: b = Array(1, 1.15) ' zero-based factors, third factor left free ~> changes to zero by default
debug.print SumPro(a, b) ' ~> 11.15 as it multiplies only first two items with 10*1 + 1*1.15 + 30*0 = 11.15
Для единственного множителя достаточно передать число в качестве второго аргумента:
Debug.Print SumPro(a, 2)