【问题标题】:Sumproduct as a function in VBASumproduct 作为 VBA 中的函数
【发布时间】:2017-12-11 00:36:45
【问题描述】:

我想看看是否可以在 VBA 中创建 sumproduct 函数。我可以制作一个在 Excel 中完美运行的文件,如下所示:

=SUMPRODUCT(C2:C19,((D2:D19="text1")*12+(D2:D19="text2")*4+(D2:D19="text3")*2))

我有 2 列,目标是根据来自另一列单元格的不同文本,将第一列中的一个单元格与一个数字相乘。如上图所示完成。但是,由于我经常使用它,实际上每次都需要一些时间来编写,所以我想看看我是否可以在 VBA 中创建一个可以选择 x(第一列)和 y(第二列)的函数和结果会在那里。到目前为止,我一直在做这件事,但还没有成功:

Function xxx(x, y)
    xxx = Application.WorksheetFunction.SumProduct(x, ((y = "text1") * 12 + y = "text2" * 4 + y = "text3" * 2))
End Function

我无法对行和列进行任何具体引用,例如 C2:C19,因为它变化很大,所以我只想选择第一列 (x) 和第二列 (y) 作为范围。有什么建议吗?谢谢阅读! :)

【问题讨论】:

  • “无法让它工作”。那么会发生什么?
  • 如果 x 是 A 列,y 是 B 列,(所以你调用 xxx("A","B") 来使用你的函数,那么你的 x 和 y 只是字符串,你需要把它们变成一个范围。即在你有 x 的地方,使用 worksheet.range(x & ":" & x)。(给你 worksheet.range("A:A")。
  • 您可以将函数构建为字符串并使用Worksheet.Evaluate方法在VBA中调用它。

标签: excel vba sum product worksheet-function


【解决方案1】:

尝试以下功能之一...

Function xxx(x As Range, y As Range)
    xxx = Evaluate("SUMPRODUCT(" & x.Address & ",((" & y.Address & "=""text1"")*12+(" & y.Address & "=""text2"")*4+(" & y.Address & "=""text3"")*2))")
End Function

Sub Test1()
MsgBox xxx(Range("C2:C19"), Range("D2:D19"))
End Sub

Function xxx(x As String, y As String)
    xxx = Evaluate("SUMPRODUCT(" & x & ",((" & y & "=""text1"")*12+(" & y & "=""text2"")*4+(" & y & "=""text3"")*2))")
End Function

Sub Test2()
MsgBox xxx("C2:C19", "D2:D19")
End Sub

【讨论】:

  • 我认为Evaluate 默认为Application.Evaluate 表单,它将在ActiveSheet 的上下文中执行,它可能不是具有您要操作的数据的工作表。使用Worksheet.Evaluate 版本确保您使用的是正确的数据。在您的第一个示例中,x.Parent.Evaluate 之类的东西应该可以工作(假设 x 和 y 在同一张纸上)。在您的第二个示例中,您需要一个 thirst 参数来指定工作表。
  • 我完全同意蒂姆!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 2021-02-14
相关资源
最近更新 更多