FormulaArray 没有计算出所有指定条目的平均值

FormulaArray not averaging out all the specified entries

Table 1:

  G             H             I             J              K 
| Lane       | Bowler      | Score        | Score        | Score        |  1
|:-----------|------------:|:------------:|:------------:|:------------:|  
| Lane 1     |       Thomas|     100      |     100      |     100      |  2
| Lane 2     |      column |     200      |     200      |     100      |  3
| Lane 3     |        Mary |     300      |     300      |     100      |  4
| Lane 1     |        Cool |     150      |     400      |     100      |  5
| Lane 2     |       right |     160      |     500      |     100      |  6
| Lane 9     |       Susan |     170      |     600      |     100      |  7

假设我想找到出现在 table 2 中的每个车道的平均值,并将它们放在 O 列中:

Table 2:

  N             O
| Lane       | Average     | 1
|:-----------|------------:|
| Lane 1     |             | 2 
| Lane 2     |             | 3 
| Lane 3     |             | 4

我会放

=AVERAGE(IF(N2=$G:$G, $I:$K )) for lane 1 (put this formula on cell "O2")

=AVERAGE(IF(N3=$G:$G, $I:$K )) for Lane 2 ("O3")

=AVERAGE(IF(N4=$G:$G, $I:$K )) for Lane 2 ("O4")

  1. 我的第一个问题是 如果我想找到出现在 table 2 中的所有车道的平均值怎么办?所以车道 1、车道 2 和车道 3 的平均值(但不是其他车道,例如车道 9)。

我的尝试:

= Average(IF(G2:G7 = N2:N4, I2:K:7)) why doesn't this work?

  1. 我的第二个问题是 我已经使用 vba:
  2. 完成了“每个车道的平均值”

.

Dim i As Integer

    For i = 2 To 4
        Cells(i, 15).FormulaArray = "=AVERAGE(IF(RC[-1]=R2C7:R7C7,R2C9:R7C12))"
    Next i

.

如果我使用 vba 而不使用 .formula 方法

会怎么样
For Lane 1 only:
pseudo code:


Loop from G2 to G7
If cell (N1) = Gx then      //x: 2 to 7
   Sum = Sum + Ix + Jx + Kx
}
Average = Sum/totalEntries

这会比我在 .formula 中使用构建速度慢吗?这样做有什么好处吗?

要获得它们的平均值,只需使用

=AVERAGE(I2:K7)

至于VBA,因为都是在同一条线上完成的,你能不能用

For i = 2 To 7
    Cells(i,"O").Value = Application.Sum(Range(Cells(i,"I"),Cells(i,"K")))
Next i

第一个问题的答案为什么会这样 FormulaArray

= Average(IF(G2:G7 = N2:N4, I2:K7)) doesn't work?

隐含在另一个 FormulaArray 的工作方式中:

= AVERAGE( IF( $G:$G = $N7, $I:$K ) ) 

让我们看看这个“单细胞公式数组”的每个部分是如何工作的:

  • 第 1 部分:$G:$G = $N7

公式的第一部分生成一个数组,其中包含范围 $G:$G 中符合条件 = $N7 的记录。 图图 1 将 FormulaArray 的第一部分显示为“多单元格公式数组”。

  • 第二部分:$I:$K

将第一部分的结果应用到第二部分,得到符合条件的分数范围= $N7 (见图2)

  • 第三部分:AVERAGE

最后公式的最后一部分计算出符合条件的分数的平均值= $N7

现在让我们尝试对公式应用相同的分析:

= AVERAGE( IF( G2:G7 = N2:N4, I2:K7 ) )

不幸的是,我们无法超越第一部分 G2:G7 = N2:N4,因为它无法尝试比较两个不同维度的数组,从而导致 #N/A (见图 3)

但是,即使数组具有相同的维度,结果也不会显示重复值,因为成员是一对一比较的(见图 4)

要获得泳道 1 到 3 的平均值,请使用此 FormulaArray

=AVERAGE( IF(
( $G:$G = $N7 ) + ( $G:$G = $N8 ) + ( $G:$G = $N9 ),
 $I:$K ) )

生成一个数组,其中的记录符合条件 = $N7 + = $N8 + = $N9 (+ 相当于运算符OR)

关于第二个问题:

性能与维护和效率有着内在的关联。

示例程序只是输入了一个硬编码的公式,仅适用于这种特殊情况,例如:

  • 如果需要更改公式来扩大范围,则必须更新宏,可能仍然需要更改公式,但无需打开 VBA 编辑器。
  • 如果列 G 之前的任何列因为过时而被删除,则需要更新宏,而公式不需要任何维护,因为它们会自动更新。

参考没有.Formula方法的宏

我发现这是多余的,因为这就像编写一个算法来做一些可以用现有函数高效准确地完成的事情,因为这样的宏不会带来任何它实际上不存在的东西。

我会考虑在工作簿非常大并且大量使用资源显着降低工作簿性能的情况下编写这样一个过程的优势,但是该过程提供的优势将不驻留,只是编写公式,但它必须计算结果并输入由公式而不是公式产生的值,从而使工作簿对最终用户来说轻便、快速和流畅。