计算非空值的行

Rob*_*bit 113 google-sheets google-sheets-formula

在Google电子表格中:如何计算具有值的给定区域的行?关于这一点的所有提示我发现到现在为止导致公式计算具有非空内容的行(包括公式),但是一个单元格

=IF(1=2;"";"")  // Shows an empty cell
Run Code Online (Sandbox Code Playgroud)

也被计算在内.

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

小智 183

我刚用过=COUNTIF(Range, "<>"),它为我计算了非空单元格.

  • 我和@DávidVeszelovszki[公式被计算]有同样的问题.我解决了`= COUNTIF(Range,"?*")` (17认同)
  • 不幸的是,这个公式还计算具有空白结果公式的单元格. (14认同)
  • 我使用`= COUNTIF(Range,"> 0")`做了一个款待. (2认同)

Del*_*ulu 118

=counta(range) 
Run Code Online (Sandbox Code Playgroud)
  • counta:"返回数据集中的数量"

    注意:CountA认为""是一个.只有空白的单元格(按单元格中的删除以将其删除)不计算在内.

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

  • countblank:"返回给定范围内的单元格数"

    注意:CountBlank考虑两个空白单元格(按删除以清空单元格)和具有返回""单元格的公式的单元格.

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

如果您的范围包含产生的公式"",则可以修改公式

=counta(range)
Run Code Online (Sandbox Code Playgroud)

至:

=Counta(range) - Countblank(range)
Run Code Online (Sandbox Code Playgroud)

编辑:函数countblank不是countblanks,后者会给出错误.

  • 不幸的是,这不适用于包含原始空白和计算空白的范围.(它从COUNTA的值中减去未计算的原始空白.) (5认同)
  • 感谢甜蜜的downvotes,OP特别提到他有空白的原因是因为公式如= IF(1 = 2;"";""),我特别提到:"如果你的范围包含公式那么造成 ""..." (3认同)

Kyl*_*Mit 35

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

=CountIf(ArrayFormula(range<>""),TRUE)
Run Code Online (Sandbox Code Playgroud)

这就是3个简单步骤的原因

第1步:简单的馅饼 - 添加额外的列

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   |
Run Code Online (Sandbox Code Playgroud)

如果我们依赖C列,我们可以得到B中的值的计数,如下所示:

=COUNTIF(C2:C6,True)
Run Code Online (Sandbox Code Playgroud)

第2步:FormulaArray用于动态创建额外列

但是,thoughtfulRatio的注释是有效的 - 如果你需要一个额外的列,你通常可以实现相同的目标ArrayFormula,可以在内存中创建一个列,而不会占用表空间.

因此,如果我们想要动态创建C,我们可以使用如下的数组公式:

=ArrayFormula(B2:B6<>"")
Run Code Online (Sandbox Code Playgroud)

如果我们简单地将它放在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                    |
Run Code Online (Sandbox Code Playgroud)

第3步:计算动态列中的值

但随着解决了这个问题,我们不再需要列来显示值.

ArrayFormula将解决以下范围:{True,True,False,True,False}.
CountIf只需要在任何范围内,在这种情况下可以计算真值的数量.

所以我们可以像这样包装CountIf产生的值ArrayFormula:

=CountIf(ArrayFormula(B2:B6<>""),TRUE)
Run Code Online (Sandbox Code Playgroud)

进一步阅读

此线程中的其他解决方案要么过于复杂,要么在我在此测试表中枚举的特定边缘情况中失败:

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

为什么它的CountA工作原理很糟糕,请参阅我的答案

  • 这个答案是唯一完整的解决方案:它只成功计算带有文本(包括空格),数字和TRUE/FALSE值的单元格,同时排除生成的空白,真正的空单元格和错误(#N/A,#REF!,#VALUE , #名称?) .它也会在没有值的情况下返回0 (3认同)
  • 我读到这个有点困惑,偶然发现这个公式也有效...... = CountIf(ArrayFormula(B2:B6 <>""),TRUE)...请不要误会我的意思,这个答案是最好的一个,应该更多的投资. (2认同)
  • @twindham同意,在构建这个答案的块时,可能更容易保持每个逻辑组件的完整性并重新排序`ArrayFormula(...)`以按照你的建议返回`CountIf`中的值数组.我已经更新了答案和电子表格演示.他们都会做同样的事情,但清洁是良好的旁边. (2认同)

Dáv*_*zki 18

对我来说,没有一个答案适用于包含原始细胞和基于公式为空的细胞的范围(例如=IF(1=2;"";""))

为我解决的是:

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

  • @KyleMit你可以通过在范围中添加一个常量值并使用`= COUNTA(filter({1; range},{1; range} <>"")从计数中减去1来消除零计数问题) - 1` (7认同)

nom*_*nom 11

这个对我有用:

=SUMPRODUCT(NOT(ISBLANK(F2:F)))
Run Code Online (Sandbox Code Playgroud)

F2列末尾的所有非空单元格的计数


con*_*tio 9

解决了我使用Yogi Anand发现的Google搜索解决方案:https://productforums.google.com/d/msg/docs/3qsR2m-1Xx8/sSU6Z6NYLOcJ

下面的示例计算A3:C范围内的非空行数,请记住使用您感兴趣的范围更新公式中的两个范围.

=ArrayFormula(SUM(SIGN(MMULT(LEN(A3:C), TRANSPOSE(SIGN(COLUMN(A3:C)))))))
Run Code Online (Sandbox Code Playgroud)

另外,请确保避免循环依赖,例如,如果您计算A:C中的非空行数并将此公式放在A或C列中,则会发生这种情况.


spa*_*kle 5

给定范围A:A,Id建议:

=COUNTA(A:A)-(COUNTIF(A:A,"*")-COUNTIF(A:A,"?*"))
Run Code Online (Sandbox Code Playgroud)

问题是COUNTA准确地计数了长度为零的字符串的单元格数""

解决的办法是精确地找到这些细胞的数量。可以通过查找所有文本单元格并减去所有带有至少一个字符的文本单元格来找到

  • COUNTA(A:A):有价值的单元格,包括""但不包括真正的空单元格
  • COUNTIF(A:A,“ *”):识别为文本的单元格,包括""但不包括真正的空白单元格
  • COUNTIF(A:A,“?*”):单元格被识别为具有至少一个字符的文本

这意味着该值COUNTIF(A:A,"*")-COUNTIF(A:A,"?*")应为文本单元格的数量减去具有至少一个字符的文本单元格的数量,即,包含确切字符的单元格的数量""


小智 5

一个对我有用的简单解决方案:

=COUNTIFS(A:A;"<>"&"")
Run Code Online (Sandbox Code Playgroud)

它计算非空的数字,字符串,日期等

  • 可以简化为= COUNTIF(A:A,"<>")的形式 (4认同)

eni*_*ger -17

使用函数“CountBlank”创建另一列来确定引用的单元格是否为空。然后对新“CountBlank”列中创建的值使用计数。

  • 我认为这是一个明确的声明,表明没有其他解决方案。非常感谢。 (3认同)