=IF(1=2;"";"") // Shows an empty cell
也会被计算在内。
这个简单任务的解决方案是什么?
=IF(1=2;"";"") // Shows an empty cell
也会被计算在内。
这个简单任务的解决方案是什么?
我刚刚使用了=COUNTIF(范围, "<>")
,它为我计算了非空单元格。
=COUNTIF(范围,"?*")
解决了这个问题。 - shawnrad=counta(range)
counta
: "计算数据集中数值的数量"
注意:CountA
将""
视为数值。只有空格单元格(按删除键使其为空)不被计入。
countblank
: "计算给定范围内的空白单元格数量"
注意:CountBlank
既将空白单元格(按删除键使其为空)视为空白单元格,也将公式返回""
的单元格视为空白单元格。
如果您的范围包含导致结果为""
的公式,则可以修改您的公式:
=counta(range)
至:=Counta(range) - Countblank(range)
注意:该函数为countblank
,而不是countblanks
,后者会报错。
=CountIf(ArrayFormula(range<>""),TRUE)
eniacAvenger的回答将提供正确的解决方案,不用担心边缘情况,因为 =A1<>""
似乎会根据我们对空单元格的直觉思考(即原始空白或创建的空白)得出正确的真值/假值。
所以想象我们有这样的数据,我们想计算 B2:B6
中非空单元格的数量:
| | <i>A</i> | <i>B</i> | <i>C</i> |
|---|-------------|-------|---------|
| <i>1</i> | <b>Description</b> | <b>Value</b> | <b>B1<>""</b> |
| <i>2</i> | Text | H | TRUE |
| <i>3</i> | Number | 1 | TRUE |
| <i>4</i> | IF -> "" | | FALSE |
| <i>5</i> | IF -> Text | h | TRUE |
| <i>6</i> | Blank | | FALSE |
如果我们依赖于列C,我们可以这样获取B中值的计数:
=COUNTIF(C2:C6,True)
FormulaArray
动态创建额外列然而,consideRatio的评论是有效的 - 如果您需要一个额外的列,您可以经常使用ArrayFormula
来实现相同的目标,它可以在内存中创建一个列而不占用表格空间。
因此,如果我们想要动态创建列C,我们可以使用以下类似的数组公式:
=ArrayFormula(B2:B6<>"")
如果我们只是将它放在C2中,它就会用一笔画创建垂直数组:
| | <i>A</i> | <i>B</i> | <i>C</i> |
|---|-------------|-------|--------------------------|
| <i>1</i> | <b>Description</b> | <b>Value</b> | <b>=ArrayFormula(B2:B6<>"")</b> |
| <i>2</i> | Text | H | TRUE |
| <i>3</i> | Number | 1 | TRUE |
| <i>4</i> | IF -> "" | | FALSE |
| <i>5</i> | IF -> Text | h | TRUE |
| <i>6</i> | Blank | | FALSE |
但是,随着这个问题的解决,我们不再需要该列仅显示数值。
ArrayFormula
将解析为以下范围:{True,True,False,True,False}
。
CountIf
可以接受任何范围,并且在这种情况下可以计算 True 值的数量。
因此,我们可以将 CountIf
包裹在由 ArrayFormula
生成的值周围,如下所示:
=CountIf(ArrayFormula(B2:B6<>""),TRUE)
本主题中的其他解决方案要么过于复杂,要么在我在这个测试表中列举的特定边缘情况下失败:
关于为什么 CountA
的工作方式如此奇怪,请参见我的答案
ArrayFormula(...)
以返回你建议的CountIf
内的值数组可能更容易。我已经更新了答案和电子表格演示。它们都会做同样的事情,但是清洁就是美德。 - KyleMit对我而言,所有的答案都没有解决既包含未使用单元格又包含使用公式返回空值单元格(例如:=IF(1=2;"";"")
)的范围的问题。
以下方法适用于我:
=COUNTA(FILTER(range, range <> ""))
Filter()
没有找到任何元素,它将返回#N/A
,而COUNTA()
将其视为一个元素,因此即使计数应该为零,它也始终会返回1。【Google Sheets示例】 - KyleMit=COUNTA(filter({1;range},{1;range}<>"")) - 1
将计数减去1来解决零计数问题。 - spacepickle对我来说有效:
=SUMPRODUCT(NOT(ISBLANK(F2:F)))
从 F2 到本列末尾的所有非空单元格数量
=ArrayFormula(SUM(SIGN(MMULT(LEN(A3:C), TRANSPOSE(SIGN(COLUMN(A3:C)))))))
同时确保避免循环依赖,如果你例如在 A 列或 C 列中计算非空行的数量并将此公式放置在 A:C 中,那么就会出现循环依赖的情况。
=SUM(ArrayFormula(IF(B3:B29&C3:C29&D3:D29&E3:E29="";0;1)))
这里的 ArrayFormula(IF(B3:B29&C3:C29&D3:D29&E3:E29="";0;1))
返回一列 0
(如果该行为空)和 1
(否则)。
另一个在consideRatio的回答中给出。
针对范围A:A
,我建议如下:
=COUNTA(A:A)-(COUNTIF(A:A,"*")-COUNTIF(A:A,"?*"))
""
的单元格。""
但不包括真正为空白的单元格""
但不包括真正为空白的单元格COUNTIF(A:A,"*")-COUNTIF(A:A,"?*")
应该是文本单元格数量减去至少包含一个字符的文本单元格数量,即包含""
的单元格数量。=COUNTIFS(A:A;"<>"&"")
在Google表格中,要计算至少包含一个非空单元格的行数,需要在二维范围内执行以下操作:
Original Answer翻译成"最初的回答"
=ARRAYFORMULA(
SUM(
N(
MMULT(
N(A1:C5<>""),
TRANSPOSE(COLUMN(A1:C5)^0)
)
>0
)
)
)
当A1:C5是您要检查非空行的范围时。
该公式来自于以下EXCELXOR文章,并在其中进行了解释 - https://excelxor.com/2015/03/30/counting-rows-where-at-least-one-condition-is-met/
“最初的回答”