- Используйте
Range("name of range here")
при доступе к диапазонам (пока игнорируете []
синтаксический сахар) - и лучше всего включать родительскую рабочую книгу и имя рабочей таблицы (которые содержат диапазон).
- Я думаю, что в вашей формуле есть ошибка. Вы не включили третий аргумент для
SUMIF
, поэтому возвращаемое значение будет равно нулю (то есть вы получите ошибку деления на 0, даже если ваш код синтаксически допустим).
- Я не думаю, что вы можете использовать
SUMPRODUCT
в VBA, как в клетке. В частности, в VBA вы не можете дважды отрицать массив (--
), чтобы превратить его в массив 1
s и 0
s. Вместо этого вам нужно вручную зациклить массив и преобразовать его в нужный массив (насколько я знаю).
Вам нужно исправить свой делитель / знаменатель в вашем подразделении (я изменил его, чтобы мой пример работал).
Предполагается, что ваша таблица subtable
находится на рабочем листе "Sheet1"
:
Option Explicit
Private Sub SumproductInVBA()
With ThisWorkbook.Worksheets("Sheet1")
Dim typeColumn As Variant
typeColumn = .Range("subtable[Type]").Value2
Dim rowIndex As Long
For rowIndex = LBound(typeColumn, 1) To UBound(typeColumn, 1)
If typeColumn(rowIndex, 1) = "Standard" Then
typeColumn(rowIndex, 1) = 1
Else
typeColumn(rowIndex, 1) = 0
End If
Next rowIndex
Dim someVariable As Double
someVariable = Application.SumProduct(typeColumn, .Range("subtable[Amount]"), .Range("subtable[Rate]")) / Application.SumIf(.Range("subtable[Type]"), "Standard", .Range("subtable[Amount]"))
End With
End Sub
Или, вместо вышеизложенного, более короткий, но медленный путь может быть:
someVariable = Application.Evaluate("SUMPRODUCT(--(subtable[Type]=""Standard""),subtable[Amount],subtable[Rate])/SUMIF(subtable[Type],""Standard"",subtable[Amount])")
Вышесказанное сработало для меня.