混合编号和文本时出现意外的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)