提取函数结果的行号
我有一个简单的表格,如果你愿意的话,有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)
你可以试试这个
=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()
函数。 我们在D1
input=MATCH(C1,B1:B5,0)
这是干什么的:IS正在查看C1
的值,这是31
查看Range("B1:B5")
,0表示完全匹配。
所以当findC1
或31
的匹配时,我们得到5,这告诉我们31 Row 5
现在,要获得Row 5
Column A
的值,我们使用INDEX()
函数作为后续:
我们在D1
join=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)
因为我们将第一个匹配的行添加1
到23
或C3
。
那么现在将返回值2
的值,值23
在Range("A2:A5")
的第二行Range("A2:A5")
, Red
在该范围的Row 1
和Blue
的Row 3
中,如图所示:
但我们不希望Row 2
我们知道23
涉及到Green
,而Green
是在Row 3
所以我们添加我们上次find的值23
( 1
或MATCH(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个最大值。 如图所示,单元格C2
的LARGE
函数取得列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中有三种情况需要处理:
-
对于最高等级的第一个(也可能是唯一的)实例,可以使用单元格
D2
计算的行号。 -
第二种情况涉及其余等级的行引用的第一个实例。 对于这些在D列中计算的行数可以再次使用(通过E列公式中的
IF
语句的TRUE
分支)。 例如,在单元格E2
(对应于第23级的第一个实例),可以使用单元格D3
的行号。 - 最后一种情况是复制成绩的行。 在此,使用不包括该等级的先前匹配的滑动范围来重新计算B列中每个副本的
MATCH
。 例如,对于列C中的重复等级23,匹配在B3:B6
的范围内,而不是在列D计算中使用的B2:B6
的范围。
按sorting顺序排列名称
最后一步很简单:获取与sorting等级对应的名称。 这里使用OFFSETfunction; 它的参数是一个单元格引用以及该引用的行和列的数量,以便find所需的值。