混合编号和文本时出现意外的COUNTIF行为(EXCEL)
这个问题是关于当用作数组公式时,Excel的COUNTIF函数如何处理不同的数据types。
有很多很好的post详细介绍了如何使用COUNTIF来完成诸如从列表中提取唯一值的任务,例如这篇文章 。 我已经设法使用这个和其他职位的例子来解决具体的问题,但我想更深入地了解数组公式以适应新的需求。
我遇到了COUNTIF的一个奇怪的行为。 一般来说,Excel似乎将string视为“大于”数字,因此以下示例是有效的:
Cell Formula Returns =1<2 TRUE ="a"<"b" TRUE ="a">"b" FALSE =1<"b" TRUE
现在,假设范围A1:A6包含以下数据集:
1 2 3 A B C
对于这个集合中的每个单元格,我想检查集合中所有单元格中小于或等于那个单元格的数量(在更复杂的公式中有用的技术)。 我在范围B1中input以下数组公式:B6:
{=COUNTIF($A$1:$A$6,"<="&$A$1:$A$6)}
(CTRL + SHIFT + ENTER)
根据上面比较数字和string的例子(也在下面的D列中说明),我期望下面显示的输出看起来像列C.然而,数组公式返回列B中显示的结果,这表明string和数字元素按照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的数组属性的解决scheme。 )
任何洞察为什么数组COUNTIF显然行为不同于单细胞的例子也将不胜感激。
注意:我已经翻译了非英文版Excel的例子,所以我提前为任何错别字道歉。
PS。 对于一个背景,当我尝试构build一个公式时,我遇到了这个问题,这个公式既从可能的重复列表中提取列表中的唯一值,也按数字/字母顺序对唯一值进行sorting。 我目前的解决scheme是分两步做到这一点。 这里提出了一个解决scheme。
如果你比较不同的行为可以很容易地显示
=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)
不能用于比较混合的文本和数字数据。
该解决scheme已由XOR LX显示。
顺便说一句:用你的PS. For a background
PS. For a background
您应该考虑德国Excel网站的以下解决scheme: 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))&""}
在这个解决scheme中, COUNTIF
与>=
进行比较,所以最大的文本或者数字将会计数到最低,从而得到最低的位置。 所有数字的位置都加上了99,所以它们比所有可能的文本位置都大。 所以我们有一个后代sorting的数组。 然后,使用LARGE
,从最高位置到最低位置创build列表。
首先,出色的问题,以及一个有趣的话题来引导。
当我第一次遇到COUNTIF(S)
/ SUMIF(S)
函数的这种行为时,我也SUMIF(S)
。 在他们的防守中,我想我们可以build立一些情境,在这些情境中,我们实际上需要将string和数字分开考虑。
为了构build你需要的公式数组,你需要像这样的东西:
MMULT(0+(TRANSPOSE($A$1:$A$6)<=$A$1:$A$6),ROW($A$1:$A$6)^0)
不过要注意的是,必要的换位意味着,包括这个结构在内的任何设置将需要与CSE进行合作。
问候
我怀疑countif是你想在这里实现的正确function。
试试这个(ctrl + shift + enter):
={SUM(IF(A1>=$A$1:$A$6,1,0))}
你会得到
1 2 3 4 5 6
PS:CountIf在内部基本上是一个数组函数。 在另一个数组函数中使用它会导致多个数组函数,它们的行为变得复杂。 数组函数最适合清除逻辑path。
正如在Excel 2013中所testing的那样,您将只在所有结果中得到1,而不是在B列中提出的结果。
目前,在您提供的function中,countif无法确定哪个单元格与哪个单元格进行比较。 数组函数扩展范围,然后执行提供的操作。 因此,它将每个单元格与同一个单元格进行比较并导致为1。
在B1
试试这个FormulaArray
然后复制到B6
:
=SUM(($A$1:$A$6<=$A1)*1)