在excel2003中 counta 统计非空单元格个数,为何不能正常统计,统计时把空单元格也一起统计了,不知何解?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在excel2003中 counta 统计非空单元格个数,为何不能正常统计,统计时把空单元格也一起统计了,不知何解?相关的知识,希望对你有一定的参考价值。

我是复制过来的,只选择粘贴数值,没能数值的也不算真空格吗?

一、首先我们先学习一下COUNTA函数的定义:
返回参数列表中非空值的单元格个数。利用函数 COUNTA 可以计算单元格区域或数组中包含数据的单元格个数。
语法
COUNTA(value1,value2,...)
Value1, value2, ... 为所要计算的值,参数个数为 1 到 30 个。在这种情况下,参数值可以是任何类型,它们可以包括空字符
(""),但不包括空白单元格。如果参数是数组或单元格引用,则数组或引用中的空白单元格将被忽略。如果不需要统计逻辑值、文字或错误值,请使用函数
COUNT。

二、真空与假空的差别:
(一)真空单元格是指该单元格没有任何内容,没有公式,没有透明的字符,没有不可见的符号,没有肉眼可见的内容。如果A1单元格为真空单元格,则在另一单元格写入公式 =A1 时,会得出0值。

(二)假空单元格是专指用公式得出的空单元格,比如单元格中写入公式 ="" 得出的就是假空单元格。不可见字符所在单元格不能算是假空单元格,因为字符不是空,是有内容的单元格,只是肉眼不可见(是非空单元格的一种)。如果A1单元格为假空单元格,则另一单元格写入公式 =A1 时,会得出空值不会得出0。

三、真空与假空的共性:
(一)当一个单元格是真空或假空时,都可以用 "" 来表示 如要判断A1单元格是否为空单元格,则可入公式 =IF(A1="","真空或假空","有内容")

(二)在真空或假空单元格中,用LEN统计字符个数时得出的值应为0个 =LEN(A1) 。
注意:
="" 是假空;
=" " 不是假空,虽然同样看不到内容,但是这是得出一个空格字符,用 =LEN(A1) 统计则得值为1。

四、非真空单元格(非空单元格):
就是指不是真正的空单元格,其包含了假空和有内容(含不可见内容)的单元格,这两种都不是真空单元格,说白了就是单元格写入了内容,不管是公式还是其他内容。
参考技术A COUNTA只能统真空的单元格个数。而有些单元格是假空的就不能了,比如,=" ",又比如有公式的,等等,换这个就可以了
=SUMPRODUCT((TRIM(A1:A100)<>"")*1)本回答被提问者和网友采纳
参考技术B 你替换掉空格就好了
全选你的数据
点编辑→替换→查找→输入一个空格→替换为→什么都不写,全部替换,就好了

计算非空值的行

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

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

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

也被计算在内。

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

【问题讨论】:

CountA 不适合你吗?另请参阅此 SO 线程:***.com/questions/12519073/… google docs count cells that contain any text可能重复 Count cells that contain any text的可能重复 【参考方案1】:

我刚刚使用了=COUNTIF(Range, "&lt;&gt;"),它为我计算了非空单元格。

【讨论】:

不幸的是,这个公式还计算了公式为空白结果的单元格。 我遇到了与@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,FalseCountIf 只接受任何范围,在这种情况下可以计算 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&";")) ,";") ---- 一直在努力解决问题 我发布了一个解决目标的答案,而不依赖于单独的列

以上是关于在excel2003中 counta 统计非空单元格个数,为何不能正常统计,统计时把空单元格也一起统计了,不知何解?的主要内容,如果未能解决你的问题,请参考以下文章

在excel中用VBA如何实现对非空单元格行数的统计。

在EXCEL中,有哪个函数可以统计单元格的个数

怎么用vba在excel中统计每列有多少行数

excel求单元格个数的函数是啥

如何统计excel中某一列字段的总数

考勤记录在一个单元格,快速统计上班天数?