【问题标题】:Count rows with not empty value计算非空值的行
【发布时间】:2014-07-27 17:11:54
【问题描述】:

在 Google 电子表格中:如何计算给定区域中具有值的行数?到目前为止,我发现的所有关于此的提示都会导致公式计算具有非空内容(包括公式)但包含

的单元格的行
=IF(1=2;"";"")  // Shows an empty cell

也被计算在内。

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

【问题讨论】:

标签: google-sheets google-sheets-formula


【解决方案1】:

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

【讨论】:

  • 不幸的是,这个公式还计算了公式为空白结果的单元格。
  • 我遇到了与@DávidVeszelovszki 相同的问题[计算公式]。我解决了=COUNTIF(Range,"?*")
  • 问题是问如何计算一个范围内的行数。您正在计算某个范围内的单元格吗?
【解决方案2】:
=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,后者会报错。

【讨论】:

  • 不幸的是,这不适用于同时包含原始空白和计算空白的范围。 (它从 COUNTA 的值中减去未计算的原始空白。)
  • 感谢甜蜜的否决,OP特别提到他有空白的原因是因为像=IF(1 = 2;“”;“”)这样的公式,我特别提到:“如果您有一个范围,其中包含导致“...”的公式
  • 问题是询问如何计算范围内的行数。您正在计算某个范围内的单元格吗?
【解决方案3】:

这是我认为迄今为止最好的解决方案:

=CountIf(ArrayFormula(range<>""),TRUE)

这就是为什么只需 3 个简单的步骤

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

answer by eniacAvenger 将产生正确的解决方案,而无需担心边缘情况,因为 =A1&lt;&gt;"" 似乎会根据我们对空白单元格(原始空白或创建的空白)的直观看法得出正确的真值/假值。

假设我们有这些数据,我们想要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)

进一步阅读

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

Google Spreadsheet - CountA Test - Demo

关于为什么CountA 的工作方式如此古怪,请参阅my answer here

【讨论】:

  • 此答案是唯一完整的解决方案:它仅成功计算包含文本(包括空格)、数字和 TRUE/FALSE 值的单元格,同时排除生成的空白、真正的空单元格和错误(#N/ A,#REF!,#VALUE,#NAME?)。如果没有值,它也会返回 0
  • 我读到这里有点困惑,无意中发现这个公式也有效... =CountIf(ArrayFormula(B2:B6""),TRUE) ... 请不要不要误会我的意思,这个答案是最好的,应该得到更多的支持。
  • @twindham,同意,就构建这个答案的块而言,保持每个逻辑组件完整并重新排序 ArrayFormula(...) 以返回 CountIf 内的值数组可能更容易你建议。我已经更新了答案和电子表格演示。他们都会做同样的事情,但清洁仅次于善良。
  • 问题是询问如何计算范围内的行数。您正在计算单列中的非空白单元格吗?您的方法可以在多个列上工作吗?
【解决方案4】:

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

为我解决了这个问题:

=COUNTA(FILTER(range, range &lt;&gt; ""))

【讨论】:

  • 如果 columnb 包含返回 "" 值的公式,这是一个很好的解决方案!非常感谢
  • 不幸的是,如果Filter() 没有找到任何元素,它将返回#N/A COUNTA() 将其视为元素,因此将始终返回1,即使计数应该为零。 Example in Google Sheets
  • @KyleMit 您可以通过在范围内添加一个常数值并使用=COUNTA(filter({1;range},{1;range}&lt;&gt;"")) - 1从计数中减去 1 来解决零计数问题
  • 问题是询问如何计算范围内的行数。您正在计算一个范围内的单元格。如果您尝试将其应用于一系列行,则此代码会中断。
【解决方案5】:

它对我有用:

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

F2列尾

的所有非空单元格的计数

【讨论】:

    【解决方案6】:

    使用我发现 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 列中,就会发生这种情况。

    【讨论】:

    • 找到了一个更干净的解决方案,我将其发布为新答案。
    • 唯一回答这个问题的解决方案是计算内部非空单元格的行数,而不是计算范围内非空单元格的数量。
    【解决方案7】:

    鉴于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 演示表,我发现这个公式仍然过多,因为它将包含任何有错误的单元格
    • 包含零长度字符串的单元格和不包含任何内容的单元格之间有区别吗?这就是人们不信任计算机的原因。 . .你明白为什么我们不能拥有美好的事物了吗?
    • 问题是询问如何计算范围内的行数。您正在计算某个范围内的单元格吗?
    【解决方案8】:

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

    =COUNTIFS(A:A;"<>"&"")
    

    它计算不为空的数字、字符串、日期等

    【讨论】:

    • 可以简化为 =COUNTIF(A:A,"")
    • 问题是问如何计算一个范围内的行数。您正在计算某个范围内的单元格吗?
    【解决方案9】:

    据我所知,这里的大多数解决方案都计算非空单元格的数量,而不是内部非空单元格的行数。

    B3:E29 范围的一种可能解决方案是例如

    =SUM(ArrayFormula(IF(B3:B29&C3:C29&D3:D29&E3:E29="";0;1)))
    

    这里ArrayFormula(IF(B3:B29&amp;C3:C29&amp;D3:D29&amp;E3:E29="";0;1)) 返回一列0(如果该行为空)和1(否则)。

    另一个在consideRatio's answer中给出。

    【讨论】:

      【解决方案10】:

      您可以使用应用程序脚本(工具 > 脚本编辑器)定义自定义函数,例如 numNonEmptyRows

      function numNonEmptyRows(range) {
        Logger.log("inside");
        Logger.log(range);
        if (range && range.constructor === Array) {
          return range.map(function(a){return a.join('')}).filter(Boolean).length
        }
        else {
          return range ? 1 : 0;
        }
      }
      

      然后在像=numNonEmptyRows(A23:C25)这样的单元格中使用它来计算A23:C25范围内的非空行数;

      【讨论】:

        【解决方案11】:

        在 Google 表格中,计算二维范围内至少包含一个非空单元格的行数:

        =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/下面的文章中解释

        【讨论】:

          【解决方案12】:

          使用 ARRAYFORMULA 是一种非常灵活的方法。

          例如,假设您想计算非空字符串(文本字段),您可以使用以下代码:

          =ARRAYFORMULA(SUM(IF(Len(B3:B14)>0, 1, 0)))
          

          这里发生的是“ArrayFormula”允许您对一组值进行操作。使用 SUM 函数,您指示“ArrayFormula”对集合的任何值求和。 “If”子句仅用于检查“空”或“非空”,1 表示非空,0 否则。 “Len”返回不同文本字段的长度,您可以在其中定义要检查的集合(范围)。最后,“ArrayFormula”将为集合(范围)内“len”返回大于 0 的每个字段求和 1。

          如果要检查任何其他条件,只需修改 IF 子句的第一个参数即可。

          【讨论】:

            【解决方案13】:

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

            【讨论】:

            • 我认为这是一个明确的声明,没有其他解决方案。非常感谢。
            • 当您需要添加另一列时,您几乎总是可以通过使用一些额外的公式来解决它,例如包含一些连接/拆分/连接等,如果我解决了,我会回复您。
            • 例如,下面的行从二维单元格区域中生成一行,这通常可以解决很多问题: =split(ArrayFormula(concatenate(C3:O4&";")) ,";") ---- 一直在努力解决问题
            • 我发布了一个解决目标的答案,而不依赖于单独的列
            猜你喜欢
            • 2018-06-27
            • 2021-11-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-20
            • 2016-11-13
            • 2019-12-20
            • 2017-06-05
            相关资源
            最近更新 更多