提取函数结果的行号

我有一个简单的表格,如果你愿意的话,有5个名字和5个等级。 在另一列中,我使用LARGE函数来排列等级。 现在有一种方法可以知道每个“有序”等级的行,以获得类似的东西吗?

White 23 31 5 Red 15 23 1 Green 23 23 3 Blue 18 18 4 Grey 31 15 2 

我无法计算的列是最后一个!

如果要排列这些等级,则应该使用rank()函数。 不大()。

 =RANK(D2,$D$2:$D$6,1) 

RankExample

你可以试试这个

 =MATCH(LARGE(B1:B5,1),B1:B5,0) 

结果是一些行…

在Cell D1 Put =INDEX($A$1:$A$5,MATCH(C1,$B$1:$B$5,0))

然后在单元格D2中放入=IF(D1<>INDEX($A$1:$A$5,MATCH(C2,$B$1:$B$5,0)),INDEX($A$1:$A$5,MATCH(C2,$B$1:$B$5,0)),INDEX($A$1:$A$5,MATCH(C2,$B$1:$B$5,0)+MATCH(C2,INDIRECT("$B$"&MATCH(C2,$B$1:$B$5,0)+1&":$B$5"),0)))

当重复的Grades出现时,这也将起作用

但我强烈build议使用Sort如下:

之前后

*****另外:*****这里是对上述公式的解释。

要获得包含我们正在查找的数字的行(列C中的数字),您需要使用Match()函数。 我们在D1input=MATCH(C1,B1:B5,0)

比赛

这是干什么的:IS正在查看C1的值,这是31查看Range("B1:B5") ,0表示完全匹配。

所以当findC131的匹配时,我们得到5,这告诉我们31 Row 5

现在,要获得Row 5 Column A的值,我们使用INDEX()函数作为后续:

我们在D1join=MATCH(C1,B1:B5,0) as =INDEX(A1:A5,MATCH(C1,B1:B5,0))

指数

这将在Row 5 Range("A1:A5")查找(这是因为=MATCH(C1,B1:B5,0) = 5)结果将是Grey

现在,如果我们拖下这个公式,我们会发现第一个问题:

问题

这是我们的两个问题:

 1) We get an `N/A` error in the last row. 2) Although `Green` is only in `Range("A1:A5")` one time we see it twice even though it would seem that `White` should be twice. 

这些是因为:

 1) We need to add `$` to the range that will remain the same so when we drag down the formula is won't shift the range. As is the formula in `D5` is `=INDEX(A5:A9,MATCH(C5,B5:B9,0))` and we receive the error *because* `Range("A5:A9")` does not contain `15`, but the issue is we meant to look in `Range("A1:A5")` 

所以我们改变公式: =INDEX($A$1:$A$5,MATCH(C1,$B$1:$B$5,0))注意我们在公式中不使用C1上的$想要这个价值随着我们的下移而改变。

修复一个

但是当他们不在时,我们仍然有双重价值的问题。

因为D1是第一个单元格,我们不会改变它的公式。 因为任何与最大价值相等的东西都是和它捆绑在一起的,我看不出任何关系为什么顺序是重要的。

相反,我们将从D2开始并input=IF(D1<>INDEX($A$1:$A$5,MATCH(C2,$B$1:$B$5,0)),INDEX($A$1:$A$5,MATCH(C2,$B$1:$B$5,0)),INDEX($A$1:$A$5,MATCH(C2,$B$1:$B$5,0)+MATCH(C2,INDIRECT("$B$"&MATCH(C2,$B$1:$B$5,0)+1&":$B$5"),0)))

这是在检查=INDEX($A$1:$A$5,MATCH(C2,$B$1:$B$5,0))的值是否等于上述行中的值。 (作为一个sorting列表,意味着所有的double值都将在另一个之上),如果它相同,那么使用该值,但是如果它是相同的,我们需要做更多的工作。

如果值不一样,我们使用公式INDEX($A$1:$A$5,MATCH(C2,$B$1:$B$5,0)+MATCH(C2,INDIRECT("$B$"&MATCH(C2,$B$1:$B$5,0)+1&":$B$5"),0)))

现在来解释一下,我将使用我们的double值的例子。 在D3我们find公式: =IF(D2<>INDEX($A$1:$A$5,MATCH(C3,$B$1:$B$5,0)),INDEX($A$1:$A$5,MATCH(C3,$B$1:$B$5,0)),INDEX($A$1:$A$5,MATCH(C3,$B$1:$B$5,0)+MATCH(C3,INDIRECT("$B$"&MATCH(C3,$B$1:$B$5,0)+1&":$B$5"),0)))

因为我们知道INDEX($A$1:$A$5,MATCH(C3,$B$1:$B$5,0))将等于上面的单元格( White ),并且我们已经了解了if我将重点关注if false值: INDEX($A$1:$A$5,MATCH(C3,$B$1:$B$5,0)+MATCH(C3,INDIRECT("$B$"&MATCH(C3,$B$1:$B$5,0)+1&":$B$5"),0))

我们知道MATCH(C3,$B$1:$B$5,0)是在这种情况下包含C3的第一个实例的行,行是Row 1因此我们需要Row 1下find23。 所以我们使用MATCH(C3,INDIRECT("$B$"&MATCH(C3,$B$1:$B$5,0)+1&":$B$5"),0)等于MATCH("23", B2:B4,0)因为我们将第一个匹配的行添加123C3

那么现在将返回值2的值,值23Range("A2:A5")的第二行Range("A2:A5")Red在该范围的Row 1BlueRow 3中,如图所示:

行2

但我们不希望Row 2我们知道23涉及到Green ,而Green是在Row 3所以我们添加我们上次find的值231MATCH(C3,$B$1:$B$5,0) )到我们当前find它的行( 2 )并获得Row 3

这里是基于这个链接中概述的方法的公式方法。 这种方法的最终布局如下所示。

电子表格布局

我假设有1个标题行,我使用2个辅助列(D&E)。 尽pipe可以将额外的行添加到标题中,但表格必须从列A开始,以便E列中的公式正常工作。

虽然辅助列可以通过将它们的公式合并到列F中的公式中来消除,但我不build议这样做:所得到的公式将是一个难以维护的问题。

需要的公式

  Cell C2: =LARGE(B:B,ROW(A2)-ROW($A$1)) [Copy down to bottom of data] Cell D2: =MATCH(C2,B:B,0) [Copy down to bottom of data] Cell E2: =D2 Cell E3: =IF(D3<>D2,D3,E2+MATCH(C3,INDIRECT("B"&(E2+1)&":B"&COUNTA(A:A)),0)) [Copy down to bottom of data] Cell F2: =OFFSET($A$2,E2-ROW($A$2),0) [Copy down to bottom of data] 

答案的解释

有四个步骤来获得答案:

  • 将成绩从最高到最低sorting(如您在示例数据中所示)

  • 创buildsorting等级的行号的部分sorting

  • 获取重复成绩的行号

  • 使用该顺序显示每个sorting等级的名称

将分数从最高到最低sorting

功能分级

正如你所做的那样,我的sorting使用LARGE函数,它返回范围或数组中的第n个最大值。 如图所示,单元格C2LARGE函数取得列B中的等级。LARGE的“n”计算为当前行号减去标题中的行数,在这种情况下,单元格A1为1行。 当公式被复制时,“n”从1进步到2到3等等

部分排列等级行号

公式获取排序名称的成绩行号,重复

下一步是确定与sorting等级相对应的未sorting等级的行号。

要做到这一点,我使用MATCH函数来查找每个sorting的等级在列B中的未sorting等级列表中的位置。MATCH有三个参数 – 要匹配的值,匹配的范围以及(可选地,匹配的types,值为0或FALSE以用于完全匹配),并且返回索引号,该索引号表示在查找范围中find匹配的位置(1表示匹配范围中的第一行,2表示匹配第二排等)。

在上面显示的单元格D2的公式中,31级的MATCH函数返回6,因为31位于列B的第六行。

单元格D4的结果显示了为什么只能通过此公式得到部分sorting。 当我们试图查找23的第二个实例的行时,公式返回值为2,这对应于23的第一个实例的行。这是因为MATCH将总是返回23的第一个匹配发现,这是在第2行!

获取重复等级的正确行数

获得重复等级的正确行数的公式

下一步是在D列中获取重复行号的正确行参考。对于表E列中的前三个单元格,显示完成此操作的公式。

列E中有三种情况需要处理:

  1. 对于最高等级的第一个(也可能是唯一的)实例,可以使用单元格D2计算的行号。

  2. 第二种情况涉及其余等级的行引用的第一个实例。 对于这些在D列中计算的行数可以再次使用(通过E列公式中的IF语句的TRUE分支)。 例如,在单元格E2 (对应于第23级的第一个实例),可以使用单元格D3的行号。

  3. 最后一种情况是复制成绩的行。 在此,使用不包括该等级的先前匹配的滑动范围来重新计算B列中每个副本的MATCH 。 例如,对于列C中的重复等级23,匹配在B3:B6的范围内,而不是在列D计算中使​​用的B2:B6的范围。

按sorting顺序排列名称

公式显示按年级排序的名称

最后一步很简单:获取与sorting等级对应的名称。 这里使用OFFSETfunction; 它的参数是一个单元格引用以及该引用的行和列的数量,以便find所需的值。