Sumproduct宏

时间:2019-06-23 10:46:49

标签: excel vba excel-formula sumproduct

我正在尝试使用SUMPRODUCT函数和SUMIF来创建宏。 但是当我运行宏时,我得到……

  

运行时错误13。

我试图在一个像这样的单元格中实现相同的功能。

=SUMPRODUCT(SUMIF(B2:B3,K15:K18,L15:L18))

它工作正常,所以我知道这个概念已经得到证明。

Sub GrandTotal() 'Finds the last non-blank cell in a single row or column
    Dim lRow As Long
    Dim lCol As Long
    Dim GrandTotal As Variant
    Dim MyRg1 As Variant
    Dim MyRg2 As Variant
    Dim MyRg3 As Variant

    'Find the last non-blank cell in column A(1)
    lRow = Cells(Rows.Count, 1).End(xlUp).Row

    'Find the last non-blank cell in row 1
    lCol = Cells(1, Columns.Count).End(xlToLeft).Column

    MsgBox "Last Row: " & lRow & vbNewLine & _
           "Last Column: " & lCol

    'set range
    Set MyRg1 = Range("B2:B3")
    'set criteria
    Set MyRg2 = Range("$K$15:$K$18")
    'set sum range
    Set MyRg3 = Range("$L$15:$L$18")

    For Each cell In Range(Cells(lRow, 2), Cells(lRow, lCol))
        GrandTotal = WorksheetFunction.SumProduct(WorksheetFunction.SumIf(MyRg1, MyRg2, MyRg3))
        cell.Value = GrandTotal
    Next cell  
End Sub

我找到了一些如何在VBA中使用该功能的指南,我遵循相同的原则,在堆栈上我还看到了另一篇文章,该文章演示了如何做,但还是出现了错误。

希望一些善良的灵魂可以提供帮助

4 个答案:

答案 0 :(得分:2)

首先,可以为每个分配了Range对象的变量声明为Range,而不是Variant。另外,传递给SUMIF的范围似乎也不正确。第一个参数或条件范围的大小应与第三个参数或总和范围的大小相同。因此,我假设分配给MyRg1和MyRg2的范围应该相反。因此,首先我们应该有以下内容...

Sub Timer ()

    Dim StartTime As Double
    Dim SecondsElapsed As Double

    StartTime = Timer


    call Macro1()
    call Macro2()
    call Macro3()


    SecondsElapsed = Round(Timer - StartTime, 2)

    MsgBox "This code ran successfully in " & SecondsElapsed & " seconds", vbInformation

End Sub

第二,您将无法以这种方式使用WorksheetFunction.Sumproduct。但是,您可以使用Evaluate方法。

Dim MyRg1 As Range
Dim MyRg2 As Range
Dim MyRg3 As Range

'set criteria range
Set MyRg1 = Range("$K$15:$K$18")

'set criteria
Set MyRg2 = Range("B2:B3")

'set sum range
Set MyRg3 = Range("$L$15:$L$18")

但是请注意,“评估”方法有一个限制。它不能接受超过255个字符。无论如何,由于要将结果转移到单元格中,因此可以先在单元格中输入实际公式,然后将其转换为值...

GrandTotal = Evaluate("SUMPRODUCT(SUMIF(" & MyRg1.Address & "," & MyRg2.Address & "," & MyRg3.Address & "))")

希望这会有所帮助!

答案 1 :(得分:0)

错误13是类型不匹配错误。我查阅了WorksheetFunction.SumIf的文档。它说第一个参数应该是Range类型,第二个和第三个参数应该是Variant类型。我现在无法测试,但是尝试将MyRg1声明为Range。

答案 2 :(得分:0)

这对于ConvertFormula是一个很好的用法,因为您已经在Excel中成功构建了公式,只需要VBA即可生成该值。请注意,convertformula不能处理超过255个字符的公式。

这里大致是您如何应用它的方法。

Sub heresExample()

'formula with the cell in exitance
Dim fCell As Range
Set fCell = Range("G10") 'set this up with a formula that works for 
   'if you were to copy paste formula.



'Your original code modified
Dim cell As Range
For Each cell In Range(Cells(lRow, 2), Cells(lRow, lCol)).Cells

        'Takes the formula and applies the value if from that exact cell.
        '(you don't really need grand total)
        GrandTotal = Evaluate(Application.ConvertFormula(fCell.Formula2R1C1, xlR1C1, xlA1, , cell))

        cell.Value = GrandTotal
Next cell


End Sub

答案 3 :(得分:0)

函数正常工作后,您可以打开Macro Recorder,单击具有所需功能的单元格,按F2,然后按Enter。您将拥有可以实现所需功能的VBA。