对于这样的问题,通常最好披露您打算如何处理结果。最佳的攻击计划通常取决于结果的使用地点和方式。
我将假设一个 VBA 函数将返回一个 double,即您正在寻找的结果就足够了。下面是几个例子。
Function byProductAutomotiveA(rngA As Range, crt As String, rng1 As Range, rng2 As Range)
Dim frmla As String
'like =SUMPRODUCT((B2:B10="Automotive")*(D2:D10)*(G2:G10))
frmla = "=SUMPRODUCT((" & rngA.Address(external:=True) & "=""" & crt & """)*" & _
"(" & rng1.Address(external:=True) & ")*" & _
"(" & rng2.Address(external:=True) & "))"
'D2:D10)*(G2:G10))
'Debug.Print frmla
byProductAutomotiveA = Application.Evaluate(frmla)
End Function
Function byProductAutomotiveB(rngA As Range, crt As String, rng1 As Range, rng2 As Range)
Dim rng As Range, rslt As Double
For Each rng In rngA
If LCase(rng.Value2) = "automotive" Then
rslt = rslt + (rng.Offset(0, rng1.Column - rng.Column).Value2 * rng.Offset(0, rng2.Column - rng.Column).Value2)
End If
Next rng
byProductAutomotiveB = rslt
End Function
Sub byProductAutomotive()
Dim rw As Long, rslt As Double
With Worksheets("Automotive")
For rw = 2 To .Cells(Rows.Count, 4).End(xlUp).Row
If LCase(.Cells(rw, 4).Value2) = "automotive" Then
rslt = rslt + (.Cells(rw, 7).Value2 * .Cells(rw, 8).Value2)
End If
Next rw
.Cells(13, 10) = rslt
End With
End Sub
以下专门丢弃隐藏的行。
Function byProductAutomotiveBH(rngA As Range, crt As String, rng1 As Range, rng2 As Range)
Dim rng As Range, rslt As Double
On Error Resume Next
For Each rng In rngA
If LCase(rng.Value2) = LCase(crt) And Not rngA.Parent.Rows(rng.Row).Hidden Then
rslt = rslt + (rng.Offset(0, rng1.Column - rng.Column).Value2 * rng.Offset(0, rng2.Column - rng.Column).Value2)
End If
Next rng
byProductAutomotiveBH = rslt
End Function
这些函数也可用于将结果检索回另一个 sub 中的 var。小心让任何Range object 正确。