计算不为空值的行


128

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

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

也算在内。

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


6
CountA不会为您工作吗?另请参阅该SO螺纹:stackoverflow.com/questions/12519073/...
Ozair Kafray


Answers:


-11

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


3
我认为这是明确的声明,没有其他解决方案。非常感谢你。
Robbit 2014年

当您需要添加另一列时,几乎可以总是通过使用一些额外的公式来解决它,例如包含一些conatinate / split / join等,如果我解决它,请尽快与您联系。
consideRatio 2015年

例如,以下一行在2d单元格范围内排成一行,通常可以解决很多问题:= split(ArrayFormula(concatenate(C3:O4&“;”)),“;”)--- -生病继续致力于解决问题
consideRatio 2015年

我发布了一个无需依赖单独列即可解决目标的答案
consideRatio

202

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


14
不幸的是,该公式也用空白结果的公式对单元格进行计数。
大卫Veszelovszki

22
我遇到了与@DávidVeszelovszki相同的问题[计算了公式]。我用=COUNTIF(Range,"?*")
shawnrad

问题是询问如何计算范围内的行。您正在计算范围内的单元格吗?
AnnanFay

124
=counta(range) 
  • counta:“返回数据集中的数量的计数”

    注意:CountA视为""一个。仅空白的单元格(在单元格中按Delete键将其空白)不计算在内。

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

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

    注意:会同时CountBlank考虑空白单元格(按Delete键以使单元格空白)和具有公式返回""空的单元格单元格的单元格。

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

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

=counta(range)

至:

=Counta(range) - Countblank(range)

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


5
不幸的是,这不适用于同时包含原始空白和计算空白的范围。(它从COUNTA的值中减去未计数的原始空白。)
DávidVeszelovszki '16

3
感谢您的甜言蜜语,OP特别提到了他之所以空白的原因是因为= IF(1 = 2;“”;“”)这样的公式,我特别提到:“如果您的范围包含包含以下公式的结果为“” ...“
Delta_zulu 2016年

问题是询问如何计算范围内的行。您正在计算范围内的单元格吗?
AnnanFay

38

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

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

这就是为什么只需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   |

如果我们依靠Column C,我们可以这样获得B中的值计数:

=COUNTIF(C2:C6,True)

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

但是,consideRatio的注释是有效的-如果您需要一个额外的列,则通常可以使用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测试-演示

有关为何如此CountA奇怪的原因,请在此处查看我的答案


4
该答案是唯一完整的解决方案:它仅对具有文本(包括空格),数字和TRUE / FALSE值的单元格进行成功计数,同时排除生成的空格,真正为空的单元格和错误(#N / A,#REF!,#VALUE) , #名称?) 。如果没有值,它将返回0
spacepickle

2
我对此有些困惑,偶然发现该公式也适用... = CountIf(ArrayFormula(B2:B6 <>“”),TRUE)...请,不要误会我,这个答案是最好的,应该更多地投票。
twindham

2
@twindham同意,就构建此答案的模块而言,保持每个逻辑组件完整无缺并按照您的建议重新排序ArrayFormula(...)以返回值数组可能更容易CountIf。我已经更新了答案和电子表格演示。他们俩都会做同样的事情,但清洁度仅次于良好度。
KyleMit

问题是询问如何计算范围内的行。您是在单列中计算非空白单元格吗?您的方法可以跨多个列工作吗?
AnnanFay

19

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

为我解决的是:

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


万一columnb包含返回“”值的形式,这是一个很好的解决方案!非常感谢
user1561325 '16

不幸的是,看起来好像Filter()没有找到任何元素,它将返回并将#N/ACOUNTA()视为元素,因此即使计数应为零,也将始终返回1。Google表格中的示例
KyleMit

7
@KyleMit您可以通过在范围内添加一个常量值并使用=COUNTA(filter({1;range},{1;range}<>"")) - 1
spacepickle的方法

问题是询问如何计算范围内的行。您正在计数范围内的单元格。如果您尝试将其应用于行范围,则该代码将中断。
AnnanFay

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
找到了更清洁的解决方案,我将其发布为新答案。
大卫Veszelovszki

1
回答问题的唯一解决方案是对内部具有非空单元格的行数进行计数,而不对范围内的非空单元格数进行计数。
Kpym '18年

7

它为我工作:

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

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


5

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

=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 17-4-16

包含零长度字符串的单元格和根本不包含任何内容的单元格之间有区别吗?这就是使人们不信任计算机的原因。。。您知道我们为什么不能拥有美好的事物吗?
Cheeso

问题是询问如何计算范围内的行。您正在计算范围内的单元格吗?
AnnanFay

5

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

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

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


5
可以简化为= COUNTIF(A:A,“ <>”)之类的格式
汤姆(Tom

问题是询问如何计算范围内的行。您正在计算范围内的单元格吗?
AnnanFay

3

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

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(否则)。

consideRatio的答案中给出了另一个。


2

您可以使用Apps脚本(工具>脚本编辑器)定义自定义函数,例如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



1

做这类事情的一种非常灵活的方法是使用ARRAYFORMULA。

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.