Excel 宏中的积

Excel 宏中的积,excel,vba,excel-formula,sumproduct,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

我正在尝试使用
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中使用函数的指南,并且遵循了相同的原则,我还看到了stack上的另一篇文章,展示了如何使用函数,但我还是发现了错误


希望一些善良的灵魂能帮助你

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

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

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

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")
其次,您将无法以这种方式使用WorksheetFunction.Sumproduct。但是,您可以使用评估方法

GrandTotal = Evaluate("SUMPRODUCT(SUMIF(" & MyRg1.Address & "," & MyRg2.Address & "," & MyRg3.Address & "))")
但是请注意,求值方法有一个局限性。它不接受超过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

希望这有帮助

首先,可以将分配给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$15:$K$18")

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

'set sum range
Set MyRg3 = Range("$L$15:$L$18")
其次,您将无法以这种方式使用WorksheetFunction.Sumproduct。但是,您可以使用评估方法

GrandTotal = Evaluate("SUMPRODUCT(SUMIF(" & MyRg1.Address & "," & MyRg2.Address & "," & MyRg3.Address & "))")
但是请注意,求值方法有一个局限性。它不接受超过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

希望这有帮助

这将是一个很好的用途,因为您已经成功地在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

这将是一个很好的用途,因为您已经成功地在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。

函数运行后,您可以打开宏录制器,单击具有所需功能的单元格,单击F2,然后单击Enter。您将拥有可以满足您需求的VBA。

您好,Domenic。非常感谢你的回答,我最终使用了你建议的最后一个选项,它似乎工作得最好,虽然解决这个问题有点困难,但它是有效的:)你可以通过换行或连接多个字符串变量生成更长的公式。你好,多梅尼克。非常感谢你的回答,我最后使用了你建议的最后一个选项,它似乎效果最好,虽然解决这个问题有点困难,但它是有效的:)你可以通过换行或连接多个字符串变量生成更长的公式。你好,阿舍。谢谢你的提示,实际上我从来没有想到过使用录音机的有用方法,但这是一种将函数转换为VBA的非常方便的方法。感谢如果我的回答真的对你有帮助,请把它标记为“有用的”。谢谢你的提示,实际上我从来没有想到过使用录音机的有用方法,但这是一种将函数转换为VBA的非常方便的方法。感谢如果我的回答确实对你有帮助,请将其标记为“有用”。