SUMPRODUCT Formula in VBA

前端 未结 3 873
粉色の甜心
粉色の甜心 2021-01-14 10:07

I want to use following SUMPRODUCT formula in VBA:

=SUMPRODUCT((Sale!$J$5:$J$1048576=C12)*Sale!$D$5:$D$1048576,Sale!$M$5:$M$1048576)
         


        
3条回答
  •  深忆病人
    2021-01-14 10:32

    Taking a guess at your use case:

    • C12 is some product you are interested in
    • Sale!$J$5:$J$1048576 is a range of products
    • (Sale!$J$5:$J$1048576=C12) gives an array like {1,1,1,0,0,0...}
    • Sale!$D$5:$D$1048576 is a range of unit prices
    • Sale!$M$5:$M$1048576 is a range of number of units sold
    • Your SUMPRODUCT gives a the revenue of for the product in C12

    So for this sample data:

    You could use this code to do leverage SUMPRODUCT:

    Option Explicit
    
    Sub SumProductWithVBA()
    
        Dim ws As Worksheet
        Dim strProduct As String
        Dim dblRevenue As Double
        Dim wsf As WorksheetFunction
        Dim v1 As Variant, v2 As Variant, v3 As Variant, v4 As Variant
        Dim i As Long
    
        Set wsf = Application.WorksheetFunction
        Set ws = ThisWorkbook.Worksheets("Sheet1")
    
        ' condition for SUMPRODUCT
        strProduct = ws.Range("A1").Value
    
        ' get the values of the ranges
        v1 = wsf.Transpose(ws.Range("A4:A15").Value)
        v2 = wsf.Transpose(ws.Range("B4:B15").Value)
        v3 = wsf.Transpose(ws.Range("C4:C15").Value)
    
        ' make the array like {1,1,1,0,0,0...etc}
        ' this is the equivalent of the SUMPRODUCT((range=value)... bit
        ReDim v4(1 To UBound(v1))
        For i = 1 To UBound(v1)
            If v1(i) = strProduct Then
                v4(i) = 1
            Else
                v4(i) = 0
            End If
        Next i
    
        ' now do the SUMPRODUCT with all the arrays set-up    
        dblRevenue = wsf.SumProduct(v4, v2, v3)
    
        ' test the output    
        MsgBox dblRevenue
    
    End Sub
    

提交回复
热议问题