【问题标题】:VBA SumIfs with OR criteria具有 OR 条件的 VBA SumIfs
【发布时间】:2014-10-15 16:40:39
【问题描述】:

我有以下公式,当我将它输入到 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?

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

【问题讨论】:

  • 不是字符串,可以尝试将其转换为数组:Array(-2, -3)。

标签: vba excel


【解决方案1】:

要在 VBA 中运行“常规”excel 公式,请将它们用括号括起来。

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

应该可以。

【讨论】:

  • 这真的很接近。我还需要一件事。我用“A2”替换了“HR Scorecard”!$D$2。我有一个 select-case 语句,它将当前工作表更改为在几张工作表之间循环。如何访问当前选定工作表的单元格 A2?
  • 澄清:在每张纸的单元格 A2 中,我有一个 2 位数的标识符。我需要在 Hours!$N 中找到该标识符的所有匹配项。如果我用其中一个代码(即“MV”)替换 'HR Scorecard'!$D$2,它可以正常工作。但是,当我创建一个名为“pc”的字符串变量并使用该变量替换“HR Scorecard”!$D$2 时,它找不到任何匹配项。
  • 我认为在 VBA 中使用条件和函数可能会更容易,而不是尝试执行 Excel 公式并将变量传递给它们。
  • 获取Active Sheet中A2的值:variable= activesheet.range("A2").value
  • 我可以毫无问题地获得价值;但是当它在 [sum(sumif... 等) 中时,它被视为字符串而不是变量,所以我认为它被评估为 'pc' 而不是 'MV'
【解决方案2】:

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

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 的方法。

【讨论】:

  • 这给了我一个应用程序定义或对象定义的错误。
【解决方案3】:

问题是数组公式在集成到 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 变体的开销。

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多