计算非空值的行数

139
在Google电子表格中:如何计算给定区域具有值的行数?到目前为止,我发现的所有提示都会导致计算那些具有非空内容(包括公式)的行数,但是一个单元格带有
=IF(1=2;"";"")  // Shows an empty cell

也会被计算在内。

这个简单任务的解决方案是什么?


6
CountA 对你来说行吗?另外可以看一下这个 Stack Overflow 的帖子:https://dev59.com/p2cs5IYBdhLWcg3w3HoG - Ozair Kafray
可能是谷歌文档计算包含任何文本的单元格的重复问题。 - KyleMit
可能是计算包含任何文本的单元格数的重复问题。 - Rubén
13个回答

215

我刚刚使用了=COUNTIF(范围, "<>"),它为我计算了非空单元格。


15
很不幸,这个公式也会计算出结果为空的公式单元格。 - David Veszelovszki
27
我遇到了与@DávidVeszelovszki相同的问题[公式被计算]。我用=COUNTIF(范围,"?*")解决了这个问题。 - shawnrad
问题在询问如何计算范围内的行数。您是在计算范围内的单元格吗? - AnnanFay

135
=counta(range) 
  • counta: "计算数据集中数值的数量"

    注意:CountA""视为数值。只有空格单元格(按删除键使其为空)不被计入。

    谷歌支持:https://support.google.com/docs/answer/3093991

  • countblank: "计算给定范围内的空白单元格数量"

    注意:CountBlank既将空白单元格(按删除键使其为空)视为空白单元格,也将公式返回""的单元格视为空白单元格。

    谷歌支持:https://support.google.com/docs/answer/3093403

如果您的范围包含导致结果为""的公式,则可以修改您的公式:

=counta(range)
至:
=Counta(range) - Countblank(range)

注意:该函数为countblank,而不是countblanks,后者会报错。


6
遗憾的是,这种方法不适用于包含空白单元格和计算出的空白单元格的范围。(它会从COUNTA函数的值中减去未计入的空白单元格。) - David Veszelovszki
4
谢谢您的反对票,OP指出他有一些空白是因为像=IF(1=2;"";"")这样的公式,我特别提到:“如果您的范围包括导致“”的公式...” - Delta_zulu
问题是询问如何计算范围内的行数。您是在计算范围内的单元格吗? - AnnanFay

42

以下是我认为目前最好的解决方案:

=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)

步骤2:使用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)

进一步阅读

本主题中的其他解决方案要么过于复杂,要么在我在这个测试表中列举的特定边缘情况下失败:

Google电子表格 - CountA测试 - 演示

关于为什么 CountA 的工作方式如此奇怪,请参见我的答案


4
这个答案是唯一完整的解决方案:它成功地仅计算包括空格在内的文字、数字和TRUE/FALSE值的单元格,同时排除生成的空白单元格、真正的空单元格和错误单元格(#N/A, #REF!, #VALUE, #NAME?)。当没有值时,它也会返回0。 - spacepickle
2
我读这个时有点困惑,偶然发现这个公式也可以用... =CountIf(ArrayFormula(B2:B6<>""),TRUE) ... 请别误会,这个答案是最好的,应该得到更多的赞。 - twindham
2
@twindham,同意你的观点,在构建这个答案的组成部分方面,保持每个逻辑组件完整并重新排列ArrayFormula(...)以返回你建议的CountIf内的值数组可能更容易。我已经更新了答案和电子表格演示。它们都会做同样的事情,但是清洁就是美德。 - KyleMit
问题是询问如何计算范围内的行数。您正在计算单列中的非空单元格吗?您的方法能够适用于多列吗? - AnnanFay

19

对我而言,所有的答案都没有解决既包含未使用单元格又包含使用公式返回空值单元格(例如:=IF(1=2;"";""))的范围的问题。

以下方法适用于我:

=COUNTA(FILTER(range, range <> ""))


如果列包含返回“”值的公式,则这是一个很好的解决方案!非常感谢。 - user1561325
不幸的是,如果Filter()没有找到任何元素,它将返回#N/A,而COUNTA()将其视为一个元素,因此即使计数应该为零,它也始终会返回1。【Google Sheets示例】 - KyleMit
8
你可以通过在范围中添加一个常量值并使用=COUNTA(filter({1;range},{1;range}<>"")) - 1将计数减去1来解决零计数问题。 - spacepickle
问题是如何计算范围内的行数。您正在计算范围内的单元格。如果您尝试将此代码应用于一系列行,则会出现错误。 - AnnanFay

11

对我来说有效:

=SUMPRODUCT(NOT(ISBLANK(F2:F)))

F2 到本列末尾的所有非空单元格数量


9
使用我在谷歌搜索中找到的Yogi Anand提供的解决方案解决:https://productforums.google.com/d/msg/docs/3qsR2m-1Xx8/sSU6Z6NYLOcJ 下面的示例计算范围A3:C中非空行的数量,请记得将公式中的两个范围都更新为您感兴趣的范围。
=ArrayFormula(SUM(SIGN(MMULT(LEN(A3:C), TRANSPOSE(SIGN(COLUMN(A3:C)))))))

同时确保避免循环依赖,如果你例如在 A 列或 C 列中计算非空行的数量并将此公式放置在 A:C 中,那么就会出现循环依赖的情况。


1
找到了一个更简洁的解决方案,我将其发布为新答案。 - David Veszelovszki
1
唯一的解决方案是回答计算具有非空单元格的行数的问题,而不是计算范围内非空单元格的数量。 - Kpym

4
据我所见,这里大多数解决方案都是计算非空单元格的数量,而不是包含非空单元格的行数。
例如,对于范围,一种可能的解决方案如下:
=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的回答中给出


4

针对范围A:A,我建议如下:

=COUNTA(A:A)-(COUNTIF(A:A,"*")-COUNTIF(A:A,"?*"))

问题在于COUNTA函数会过度计数所有值为""的单元格。
解决方法是找到这些单元格的确切数量。可以通过查找所有文本单元格并减去至少包含一个字符的所有文本单元格来找到这些单元格的数量。
  • COUNTA(A:A):具有值的单元格,包括""但不包括真正为空白的单元格
  • COUNTIF(A:A,"*"):被识别为文本的单元格,包括""但不包括真正为空白的单元格
  • COUNTIF(A:A,"?*"):被识别为至少有一个字符的文本的单元格
这意味着值COUNTIF(A:A,"*")-COUNTIF(A:A,"?*")应该是文本单元格数量减去至少包含一个字符的文本单元格数量,即包含""的单元格数量。

使用 @KyleMit 的演示表格,我发现这个公式仍然会出现过多计数,因为它会包括任何带有错误的单元格。 - spacepickle
一个单元格包含零长度字符串和一个单元格什么都不包含是有区别的吗?这就是让人们不信任计算机的原因...你看到为什么我们不能拥有好东西了吗? - Cheeso
这个问题是在问如何计算一个区域内的行数。你是在计算该区域内的单元格吗? - AnnanFay

4
一种对我有效的更简单的解决方案是:
=COUNTIFS(A:A;"<>"&"")

它会计算非空的数字、字符串、日期等。

5
可以简化成这样的形式:=COUNTIF(A:A,"<>")。 - Tom
问题是询问如何计算一个区域内的行数。您是在计算一个区域内的单元格吗? - AnnanFay

2

在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/

“最初的回答”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接