【问题标题】:Unexpected COUNTIF behavior when mixing number and text (EXCEL)混合数字和文本时出现意外的 COUNTIF 行为 (EXCEL)
【发布时间】:2015-10-27 01:32:20
【问题描述】:

这个问题是关于 Excel 的 COUNTIF 函数在用作数组公式时如何处理不同的数据类型。

那里有很多很好的帖子,详细介绍了如何将 COUNTIF 用于从列表中提取唯一值等任务,例如 this post。我已经设法使用此帖子和其他帖子中的示例来解决特定问题,但我正在尝试更深入地了解数组公式,以使我的公式适应新的需求。

我遇到了 COUNTIF 的一种特殊行为。通常,Excel 似乎将字符串视为“大于”数字,因此以下示例是有效的:

Cell Formula      Returns
=1<2              TRUE
="a"<"b"          TRUE
="a">"b"          FALSE
=1<"b"            TRUE

现在,假设范围 A1:A6 包含以下数据集:

1
2
3
A
B
C   

对于该集合中的每个单元格,我想检查该集合中的所有单元格中有多少小于或等于该单元格(在更复杂的公式中是一种有用的技术)。我在 B1:B6 范围内输入以下数组公式:

{=COUNTIF($A$1:$A$6,"&lt;="&amp;$A$1:$A$6)} (CTRL + SHIFT + ENTER)

根据上面比较数字和字符串的示例(也在下面的 D 列中说明),我希望下面显示的输出看起来像 C 列。但是,数组公式返回 B 列中显示的结果,这表明字符串和数字元素按数组 COUNTIF 分别计数。

Column A     Column B     Column C     Column D
1            1            1            A1<"C" = TRUE
2            2            2            A2<"C" = TRUE
3            3            3            A3<"C" = TRUE
A            1            4            A4<"C" = TRUE
B            2            5            A5<"C" = TRUE
C            3            6            A6<"C" = FALSE

所以问题是如何在 C 列中产生输出? (编辑: 澄清一下,我专门寻找利用 COUNTIF 数组属性的解决方案。)

如果能深入了解为什么按数组方式 COUNTIF 的行为显然与单单元格示例不同,我们也将不胜感激。

注意:我已经从非英文版的 Excel 中翻译了示例,因此对于任何拼写错误,我提前道歉。

PS。作为背景,当我尝试构建一个公式时遇到了这个问题/按字母顺序。我目前的解决方案是分两步完成。如何一步完成的一种解决方案is proposed here。

【问题讨论】:

  • 我相信你可能错误地使用了COUNTIF。
  • 语法{=COUNTIF($A$1:$A$6,"&lt;="&amp;$A$1:$A$6)} 实际上是从一个更复杂的公式中提取出来的,该公式的行为与预期完全相同,并且被其他人用来解决类似问题。这篇文章说明了该公式中的一个中间步骤。

标签: arrays excel excel-formula


【解决方案1】:

首先,问题的布局非常好,而且是一个有趣的话题。

当我第一次遇到COUNTIF(S)/SUMIF(S) 函数的这种行为时,我也挑了挑眉。为他们辩护,我想我们可以构建我们实际上希望单独考虑字符串和数字的情况。

为了构造您所需的公式内数组,您需要以下内容:

MMULT(0+(TRANSPOSE($A$1:$A$6)&lt;=$A$1:$A$6),ROW($A$1:$A$6)^0)

但请注意,必要的转置意味着任何包含此构造的设置都需要使用 CSE 提交。

问候

【讨论】:

    【解决方案2】:

    如果你比较,不同的行为可以很容易地显示出来

    =COUNTIF($A$1:$A$6,"&lt;=A")

    与

    {=COUNT(IF($A$1:$A$6&lt;="A",1))}

    第一个只会从$A$1:$A$6 获取文本值,因为它显然是要比较的文本,然后忽略其他值会更快。出于同样的原因,=COUNTIF($A$1:$A$6,"&lt;=3") 只会从$A$1:$A$6 获取数值。即使标准是与单元格引用的串联,那么串联将是第一个过程,并且会导致“

    第二个首先需要一个比较数组,然后执行IF,得到一个1或FALSE的数组,然后计数。但“A”也可以是单元格引用。所以不清楚一开始要比较什么,第一个数组必须比较$A$1:$A$6中的所有值。

    所以COUNTIF(S) 和SUMIF(S) 不能用于比较混合文本和数字数据。

    XOR LX 已经给出了解决方案。

    顺便说一句:使用您的PS. For a background,您应该考虑来自德国 Excel 网站的以下解决方案:http://www.excelformeln.de/formeln.html?welcher=236。

    在您的链接示例中:

    B2中的公式向下

    {=INDEX($A$2:$A$99,MATCH(LARGE(COUNTIF(A$2:A$99,">="&A$2:A$99)+99*ISNUMBER(A$2:A$99),ROWS($1:1)),COUNTIF(A$2:A$99,">="&A$2:A$99)+99*ISNUMBER(A$2:A$99),0))&""}
    

    在此解决方案中,COUNTIF 与 &gt;= 进行比较,因此最大的文本或数字将计数最低,因此获得最低位置。所有数字位置都加上 99。因此它们永远大于所有可能的文本位置。所以我们有一个降序排列的数组。然后,使用LARGE,从最高位置到最低位置创建列表。

    【讨论】:

    • 谢谢,这有点道理 :)
    【解决方案3】:

    我怀疑 countif 是否适合您在此处实现的目标。

    试试这个(ctrl+shift+enter):

    ={SUM(IF(A1>=$A$1:$A$6,1,0))}
    

    你会得到

    1
    2
    3
    4
    5
    6
    

    PS:CountIf 在内部基本上是一个数组函数。在另一个数组函数中使用它会导致多个数组函数并且它们的行为变得复杂。数组函数最好在逻辑路径清晰的情况下使用。

    正如在 Excel 2013 中测试的那样,您只会在所有结果中得到 1,而不是 B 列中建议的结果。

    目前,在您提供的函数中,countif 无法确定要与哪个单元格进行比较。数组函数扩展范围,然后执行提供的操作。因此,它将每个单元格与同一个单元格进行比较,结果为 1。

    【讨论】:

    • 也许你可以澄清你的评论“我怀疑 countif 是你想要在这里实现的正确功能。”?你有什么依据?哪些见解使您得出这个结论,这也可能有助于 OP 帮助他们了解他们目睹的 COUNTIF 行为?
    • 另外,为什么单元格引用A1在括号中?
    • 括号不是必需的。
    • 至于只得到B列只有1的向量,这是将公式only输入到单元格B1然后复制粘贴下来的结果。要重现 B 列,您需要在输入公式之前标记整个范围 B1:B6。
    • 是的,重点是,在这个简单的例子中,COUNTIF 并不是绝对必要的。但它在更复杂的公式中是一个有用的构造,例如当条件是动态范围时。
    【解决方案4】:

    在B1 中试试这个FormulaArray,然后复制到B6:

    =SUM(($A$1:$A$6<=$A1)*1)
    

    【讨论】:

    • 谢谢,这当然适用于复制 C 列。(我应该更具体一点,因为我正在寻找特别是 COUNTIF 的解决方案,它可以扩展到具有标准动态范围的情况。 )
    猜你喜欢
    • 2018-01-23
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    相关资源
    最近更新 更多