公差平均值(忽略#NA 等)

Tolerant average (ignore #NA, etc.)

我想计算一个范围内的平均值(图中B1:B12或C1:C12),不包括:

  1. 非数字单元格,包括空字符串、无内容的空白单元格、#NA、文本等(此处为 B1+B8:B12 或 C1+C8:C12)。
  2. 范围内对应单元格(此处为 A1:A12)的值超出区间(此处为 [7,35])的单元格。这将进一步排除 B2:B3 或 C2:C3。 此时,A列的单元格可能包含数字,也可能没有内容。

我认为不可能使用任何内置的类似 AVERAGE 的函数。然后,我尝试计算总和、计数和除法。当我在范围内有 #N/A 时,我可以计算计数(F2 和 F7),但不能计算总和(F3),例如

我该怎么做?

备注:

  1. G 列显示 F 列中的公式。
  2. 我无法过滤和使用 SUBTOTAL
  3. B8:C8 包含没有内容的空白单元格,B9:C9 包含空字符串。
  4. 我正在寻找(非用户定义的)公式,即非VBA。

您可以通过使用基于嵌套 IF 的 数组公式 来完成此操作,以提供至少部分条件。当 IF 解析为 FALSE 时,它不再处理语句的 TRUE 部分。

F2:F3中的数组公式是,

=SUM(IF(NOT(ISNA(B2:B13)), (A2:A13>=7)*(A2:A13<=35)*(B2:B13<>"")))
=SUM(IF(NOT(ISNA(B2:B13)), IF(B2:B13<>"", (A2:A13>=7)*(A2:A13<=35)*B2:B13)))

F7:F8中的数组公式是,

=SUM(IF(NOT(ISNA(C2:C13)), (A2:A13>=7)*(A2:A13<=35)*(C2:C13<>"")))
=SUM(IF(NOT(ISNA(C2:C13)), IF(C2:C13<>"", (A2:A13>=7)*(A2:A13<=35)*C2:C13)))

数组公式需要用Ctrl+Shift+Enter↵完成。正确输入后,如有必要,可以像任何其他公式一样填写它们。

数组公式随着它们引用的范围扩大而以对数方式增加计算负载。尽量将多余的空白行保持在最低限度,并避免引用完整的列。

您可以在一个相当简单的公式中获得 "NA" 列值的平均值,如下所示:

=AVERAGE(IF(
            (
             ($A:$A>=$F)*
             ($A:$A<=$F)*
             ISNUMBER(B2:B13)
                             )>0,
                                 B2:B13))

使用 CtrlShiftEnter↵.[=21= 作为数组公式输入]

我发现这是一种非常清晰的书写方式,因为您的所有条件都排成一行。他们 "and'ed" 使用数学运算符 *;这当然会将 TRUE 和 FALSE 值分别转换为 1 和 0,因此当完成与操作后,我使用 >0 将它们转换回 TRUE/FALSE。请注意,我没有对阈值 7 和 35 进行硬编码(硬编码文字通常被认为是不好的做法),而是将它们放在单元格中。

总和和计数的逻辑相同;只需将 AVERAGE 分别替换为 SUMCOUNT

=SUM(IF((($A:$A>=$F)*($A:$A<=$F)*ISNUMBER(B2:B13))>0,B2:B13))
=COUNT(IF((($A:$A>=$F)*($A:$A<=$F)*ISNUMBER(B2:B13))>0,B2:B13))

尽管也可以使用更简洁的公式进行计数:

=SUM(($A:$A>=$F)*($A:$A<=$F)*ISNUMBER(B2:B13))

相同的公式可用于 average/sum/count 您的 "blank" 列。在这里,我只是将它们拖复制到右侧一列(G 列),这意味着 B2:B13 的所有实例都变成了 C2:C13.

来自 :

Providing you are using Excel 2010 and above the AGGREGATE function can be optioned to ignore all errors.

=AGGREGATE(1, 6, A1:A5)