Ega*_*lth 6 arrays excel excel-formula
这个问题是关于Excel的COUNTIF函数在用作数组公式时如何处理不同的数据类型.
有很多好的帖子详细说明如何使用COUNTIF执行任务,例如从列表中提取唯一值,例如这篇文章.我已经设法使用此帖和其他帖子中的示例来解决特定问题,但我正在尝试更深入地了解数组公式,以使我的公式适应新的需求.
我遇到了COUNTIF的一种特殊行为.通常,Excel似乎将字符串视为"大于"数字,因此以下示例有效:
Cell Formula Returns
=1<2 TRUE
="a"<"b" TRUE
="a">"b" FALSE
=1<"b" TRUE
Run Code Online (Sandbox Code Playgroud)
现在,假设范围A1:A6包含以下数据集:
1
2
3
A
B
C
Run Code Online (Sandbox Code Playgroud)
对于此集合中的每个单元格,我想检查集合中所有小于或等于该单元格的单元格中的多少(在更复杂的公式中是一种有用的技术).我在范围B1中输入以下数组公式:B6:
{=COUNTIF($A$1:$A$6,"<="&$A$1:$A$6)} (CTRL + SHIFT + ENTER)
基于上面比较数字和字符串的示例(也在下面的D列中说明),我希望下面显示的输出看起来像C列.但是,数组公式返回B列中显示的结果,这表明字符串和数字元素由arraywise 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
Run Code Online (Sandbox Code Playgroud)
那么问题是如何在C列中产生输出?(编辑: 只是为了澄清,我特意寻找使用COUNTIF数组属性的解决方案.)
任何洞察为什么arraywise COUNTIF显然表现出不同于单细胞的例子也将非常感激.
注意:我已经从非英语版本的Excel中翻译了这些示例,所以我提前为任何拼写错误道歉.
PS.对于背景,当我尝试构建一个既可以从列表中提取可能重复的唯一值的公式时又遇到了这个问题,并按数字/字母顺序对唯一值进行排序.我目前的解决方案是分两步完成.这里提出了一个如何一步完成的解决方案.
如果您进行比较,可以很容易地显示出不同的行为
=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即使标准是与单元格引用的串联,那么该串联将是第一个过程,并且会导致“<=A”或“<=3”。因此,比较什么是文本还是数字就一清二楚了。
第二个首先需要一个比较数组,然后执行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))&""}
Run Code Online (Sandbox Code Playgroud)
在此解决方案中,进行COUNTIF比较>=,因此最大的文本或数字将计数最低,因此获得最低位置。所有数字位置都加上 99。因此它们永远大于所有可能的文本位置。所以我们有一个降序排序的数组。然后,使用LARGE,从最高位置到最低位置创建列表。