我有以下公式,当我将其输入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吗?
编辑:我确实通过将其作为字符串传递给单元格来实现此功能,但我需要将值(而不是公式)传递给单元格。
答案 0 :(得分:0)
我无法复制该示例,因为我遗漏了一些有关数据和其余代码的信息。但是,试试这个:
With Application.WorksheetFunction
sumact = .Sum(.SumIfs(wsHours.Columns(S), wsHours.Columns(N), A2, wsHours.Columns(H), Array(-2,-3)))
End With
更正是:
答案 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}))]
应该工作。