带有OR标准的VBA SumIfs

时间:2014-10-15 16:40:39

标签: excel vba excel-vba

我有以下公式,当我将其输入Excel单元格时可以使用:

=SUM(SUMIFS(Hours!$S:$S, Hours!$N:$N, 'HR Scorecard'!$D$2, Hours!$H:$H, {-2,-3}))

我现在正尝试将其转换为VBA函数。我遇到的问题是它说{是一个无效的字符。

sumact = Application.WorksheetFunction.Sum(Application.WorksheetFunction.SumIfs(wsHours.Columns(S), wsHours.Columns(N), A2, wsHours.Columns(H), {-2,-3}))

所以我的第一个问题是,我该如何替换{-2,-3}以使其工作? 其次,在Sum和SumIfs之前我需要Application.WorkSheetFunction吗?

编辑:我确实通过将其作为字符串传递给单元格来实现此功能,但我需要将值(而不是公式)传递给单元格。

3 个答案:

答案 0 :(得分:0)

我无法复制该示例,因为我遗漏了一些有关数据和其余代码的信息。但是,试试这个:

With Application.WorksheetFunction
    sumact = .Sum(.SumIfs(wsHours.Columns(S), wsHours.Columns(N), A2, wsHours.Columns(H), Array(-2,-3)))
End With

更正是:

  1. 将最后一个输入写为数组(如问题评论中所示);
  2. 使用“With”块访问Application.WorksheetFunctions的方法。

答案 1 :(得分:0)

问题是阵列公式在集成到VBA中时表现不佳。我无法解释它,因为我缺乏关于它们如何作为公式的知识,但是在VBA中实现它们几乎是徒劳的,除非你知道你正在做什么。

也就是说,如果性能不是很大的问题,那就使用Evaluate。例如,以下子例程按预期执行:

Sub Test()
    MsgBox Evaluate("=SUM(2,3)") 'Shows a message box: 5
End Sub

假设Sheet5中的下表:

Foo     10
Bar     15
Grok    30
Spam    20
Foo     50
Bar     60
Grok    20
Spam    90

以下子程序也按预期执行:

Sub Test2()
    MsgBox Evaluate("=SUMIF(Sheet5!$A:$A,""Foo"",Sheet5!$B:$B)") '60
End Sub

如果需要,您甚至可以将其存储在变量中。

Sub Test3()
    ans = Evaluate("=SUMIF(Sheet5!$A:$A,""Grok"",Sheet5!$B:$B)") '50
    MsgBox ans
End Sub

不可否认,由于它是从VBA执行的,速度会受到一点打击。但是,应用程序的易用性远远超过编写纯VBA变体的开销。

答案 2 :(得分:0)

运行"常规"在VBA中使用excel公式,用括号括起来。

sumact= [SUM(SUMIFS(Hours!$S:$S, Hours!$N:$N, 'HR Scorecard'!$D$2, Hours!$H:$H, {-2,-3}))]

应该工作。