宏中的和积

Sumproduct in macro

我正在尝试将 SUMPRODUCT 函数与 SUMIF 一起使用来制作宏。 但是当我 运行 宏时,我得到…

run-time error 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:$K")
    'set sum range
    Set MyRg3 = Range("$L:$L")

    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 中的函数的指南,我遵循了相同的原则,我还在堆栈上看到另一个 post 展示了如何做,但我得到错误。

希望有好心人帮忙

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

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

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

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

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

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

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

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

但是请注意,Evaluate 方法有一个限制。它不接受超过 255 个字符。不管怎样,既然要将结果转移到单元格中,那么可以先在单元格中输入实际的公式,然后再转换成数值...

With cell
    'enter the formula in the current cell
    .Formula = "=SUMPRODUCT(SUMIF(" & MyRg1.Address & "," & MyRg2.Address & "," & MyRg3.Address & "))"
    'convert the formula into a value
    .Value = .Value
End With

希望对您有所帮助!

这对 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

在您的功能正常运行后,您可以打开宏录制器,单击包含您需要的功能的单元格,按 F2,然后按 Enter。你将拥有 VBA 做你想做的事情。