这个问题是关于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,"<="&$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($A$1:$A$6,"<=A")

{=COUNT(IF($A$1:$A$6<="A",1))}
第一个将仅从$A$1:$A$6获取文本值,因为显然它是要比较的文本,然后可以更快地忽略其他值。出于相同的原因,=COUNTIF($A$1:$A$6,"<=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>=进行比较,因此最大的文本或数字将计数最低,从而获得最低的位置。所有数字位置均加上99。因此它们比所有可能的文本位置大。因此,我们有一个降序的排序数组。然后,使用LARGE,从最高位置到最低位置创建列表。

10-06 05:05