【问题标题】:Error with array formula in VBAVBA中的数组公式错误
【发布时间】:2017-07-22 21:55:57
【问题描述】:
 A      B    C   D  
east    1   56
west    5   98
east    1   78
west    5   99
south   3   23
east    2   45
south   3   67

我想得到 A+B 相同组合的最大值。例如,对于east1,我应该在D 列中得到78。为此,我使用的是VBA,但代码似乎不起作用。我正在使用数组公式。

我的代码是:

.Range("D2:D" & OutputLastRow).FormulaArray = "=MAX(("$A$2:$A$" & OutputLastRow=A2)*("$B$2:$B$" & OutputLastRow=B2)*("$C$2:$C$" & OutputLastRow))"

代码运行没有任何错误,但结果是错误的,因为随着公式从 D2 向下移动,单元格 A2 和 B2 没有得到更新。 A2 保留为 A2,B2 保留为 B2。我已经尝试使用循环,但这也不起作用。

【问题讨论】:

  • 该行没有错误就无法运行 - 它在语法上不正确。
  • 考虑创建一个数据透视表。它可能会产生更整洁、更易读的报告。

标签: arrays vba excel excel-formula


【解决方案1】:

在多单元格区域上使用.FormulaArray 时,它不像将数组公式放入第一个单元格并自动填充。您应该分两步明确地执行此操作。您的代码,经过一些更正后,应该是这样的:

' 1- Enter the array formula in top cell
Range("D2").FormulaArray = _
  "=MAX(($A$2:$A$" & OutputLastRow & "=A2)*($B$2:$B$" & OutputLastRow & _
  "=B2)*($C$2:$C$" & OutputLastRow & "))"

' 2- Then autofill down the column
Range("D2:D" & OutputLastRow).FillDown 

或者,您可以使用AGGREGATE 函数创建一个与您的完全等价的“正常”公式:

Range("D2:D" & OutputLastRow).Formula = _
  "=Aggregate(14, 6, ($A$2:$A$" & OutputLastRow & "=A2)*($B$2:$B$" & OutputLastRow & _
  "=B2)*($C$2:$C$" & OutputLastRow & "), 1)"

【讨论】:

  • @AndreTerra Aggregate 是在 Excel 2010 中引入的。它真的强大而酷。尽管如此,我还是花了一段时间才开始使用它,而且我经常遇到尚未将它添加到他们的武器库中的 Excel 熟练用户。
  • @A.S.H..谢谢..第二个具有聚合函数的函数对我有用,但数组一仍然存在未更新单元格 A2 和 B2 的相同问题。我还是不明白为什么会这样……
  • @ShashankChandra 这可能是由于一些错误或范围内的#NAs。带有选项6AGGREGATE 函数允许忽略这些错误。
【解决方案2】:

您实际上并不需要 VBA。在D1 中输入以下数组公式(使用 Ctrl+Shift+Enter 而不是 Enter)并将其向下拖动

=MAX(IF(A1&B1=$A$1:$A$7&$B$1:$B$7,$C$1:$C$7))

您的输出应如下所示:

该公式有效,因为 MAX 和 MIN 忽略了 A1&B1 = $A$1:$A$7&$B$1:$B$7 的 FALSE 值,仅对剩余结果进行运算。数组公式使得A1&B1$A$1:$A$7&$B$1:$B$7 的“当前行”值进行比较。我想您可以像这样锁定$A1&$B1 的列,但在您的示例中没有必要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多