这个问题是关于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
,从最高位置到最低位置创建列表。