计算值不为空的行数

在 Google 电子表格中: 如何计算给定区域中有值的行数?到目前为止,我发现的所有关于这一点的提示都导致了一个公式,该公式计算的行不包含空内容(包括公式) ,而是包含

=IF(1=2;"";"")  // Shows an empty cell

也算。

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

220278 次浏览

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

解决方案,我发现谷歌由瑜伽阿南德: 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 列中,就会发生这种情况。

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

=counta(range)
  • counta: “返回数据集中 价值观数目的计数”

    注: CountA认为 ""价值。只有空白的单元格(在单元格中按删除键将其空白)不计数。

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

  • 返回给定范围内的 空荡荡的单元格数

    注意: CountBlank同时考虑空白单元格(按删除键为空白单元格)和具有返回 ""的公式的单元格为 空荡荡的单元格。

    谷歌支持: https://Support.Google.com/docs/answer/3093403

如果您的范围包含导致 ""的公式,那么您可以从

=counta(range)

致:

=Counta(range) - Countblank(range)

编辑: 函数是 countblank,而不是 countblanks,后者会给出一个错误。

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

我的答案是:

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

我认为这是目前为止最好的解决办法:

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

以下是三个简单的步骤

步骤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   |

如果我们依赖于 C 栏,我们可以得到像下面这样的 B 中值的计数:

=COUNTIF(C2:C6,True)

步骤2: 使用 FormulaArray动态创建额外列

然而,考虑比率的评论是一个有效的方法-如果你需要一个额外的列,你可以通过使用 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的工作方式不稳定,见 我的答案就在这里

鉴于 A:A的范围,我建议:

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

问题在于 COUNTA 重复计算了具有零长度字符串 ""的单元格的数目。

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

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

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

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

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

它同时计算非空的数字、字符串、日期等

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

作为一个例子,假设你想要计算非空字符串(文本字段) ,你可以使用下面的代码:

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

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

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

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

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

=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(else)。

另一个是在 比率的答案中给出的。

您可以使用 Apps Script (Tools > Script Editor)定义一个自定义函数,例如 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中非空行的数量;

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

=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/,下面的文章对此进行了解释

这对我很有用:

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

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