这是我认为迄今为止最好的解决方案:
=CountIf(ArrayFormula(range<>""),TRUE)
这就是为什么只需 3 个简单的步骤
第 1 步:简单如馅饼 - 添加额外的列
answer by eniacAvenger 将产生正确的解决方案,而无需担心边缘情况,因为 =A1<>"" 似乎会根据我们对空白单元格(原始空白或创建的空白)的直观看法得出正确的真值/假值。
假设我们有这些数据,我们想要B2:B6 中的非空白计数:
| | A | B | C |
|---|-------------|-------|---------|
| 1 | Description | Value | B1<>"" |
| 2 | Text | H | TRUE |
| 3 | Number | 1 | TRUE |
| 4 | IF -> "" | | FALSE |
| 5 | IF -> Text | h | TRUE |
| 6 | Blank | | FALSE |
如果我们依赖 C 列,我们可以像这样得到 B 中的值的计数:
=COUNTIF(C2:C6,True)
第二步:使用FormulaArray动态创建Extra Column
但是,consideRatio's comment 是有效的 - 如果您需要一个额外的列,您通常可以使用 ArrayFormula 实现相同的目标,它可以在内存中创建一个列而不会占用工作表空间。
所以如果我们想动态创建C,我们可以使用这样的数组公式:
=ArrayFormula(B2:B6<>"")
如果我们简单地把它放在C2中,它会用一个笔划来创建垂直数组:
| | A | B | C |
|---|-------------|-------|--------------------------|
| 1 | Description | Value | =ArrayFormula(B2:B6<>"") |
| 2 | Text | H | TRUE |
| 3 | Number | 1 | TRUE |
| 4 | IF -> "" | | FALSE |
| 5 | IF -> Text | h | TRUE |
| 6 | Blank | | FALSE |
第 3 步:计算动态列中的值
但解决了这个问题后,我们不再需要列来仅显示值。
ArrayFormula 将解析为以下范围:{True,True,False,True,False}。
CountIf 只接受任何范围,在这种情况下可以计算 True 值的数量。
所以我们可以将CountIf 包裹在ArrayFormula 产生的值周围,如下所示:
=CountIf(ArrayFormula(B2:B6<>""),TRUE)
进一步阅读
此线程中的其他解决方案要么过于复杂,要么在我在此测试表中列举的特定边缘情况下失败:
关于为什么CountA 的工作方式如此古怪,请参阅my answer here