提取函数结果的行号

时间:2013-04-23 13:50:57

标签: excel

如果你愿意,我有一个简单的表,有5个名字和5个等级。 在另一列中,我使用LARGE函数订购等级。 现在有没有办法知道每个“有序”等级的行,以获得类似的东西?

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

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

4 个答案:

答案 0 :(得分:1)

如果要对这些成绩进行排名,则应使用rank()函数。不大()。

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

RankExample

答案 1 :(得分:1)

你可以试试这个

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

结果是一些行...

答案 2 :(得分:1)

在单元格D1中放置=INDEX($A$1:$A$5,MATCH(C1,$B$1:$B$5,0))

然后在Cell 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

时,这也会有效

但我强烈建议使用Sort作为以下内容:

Before After

*****另外:*****以下是对上述公式的解释。

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

Match

这是做什么的:我正在寻找C1中的值,这是31 它正在寻找Range("B1:B5"),0代表完全匹配。

因此,在查找与C131的匹配时,我们会得到5.这告诉我们31位于Row 5

现在,为了获得Column A Row 5的价值,我们使用INDEX()功能如下:

我们在=MATCH(C1,B1:B5,0)D1添加=INDEX(A1:A5,MATCH(C1,B1:B5,0))

INDEX

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

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

Issue

以下是我们的两个问题:

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因为我们 WANT 此值会随着我们向下移动而改变。

Fix one

但是,当它们不应该存在时,我们仍然会遇到双值问题。

因为D1是第一个单元格,所以我们不会更改其中的公式。因为任何等于最大价值的东西都与它紧密相连,我认为没有任何理由说明领带的顺序是重要的。

相反,我们将从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)))

这样做是检查=INDEX($A$1:$A$5,MATCH(C2,$B$1:$B$5,0))的价值 不等于上面一行中的值。 (作为一个排序列表意味着所有双重值都将在彼此之上)并且如果它是 NOT 相同然后使用该值,但如果它是相同的我们需要做更多的工作。

如果值不相同,我们使用公式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)))

现在解释一下,我将使用我们的双值示例。在D3中,我们找到了公式:=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的工作方式,我将重点关注if false值of: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的第一个实例的行23,行是Row 1所以我们需要在行Row 1下的行。因此,我们使用等于MATCH(C3,INDIRECT("$B$"&MATCH(C3,$B$1:$B$5,0)+1&":$B$5"),0)的{​​{1}},因为我们正在为MATCH("23", B2:B4,0)1的第一个匹配的行添加23

现在将返回C3的值,因为值2位于23的第二行,Range("A2:A5")位于Red中,如下所示Row 1范围内的Blue

Row2

但我们不希望Row 3我们知道Row 223相关,而Green位于Green所以我们添加了行最后找到值Row 3231)到我们当前找到的行(MATCH(C3,$B$1:$B$5,0))并获取2

答案 3 :(得分:0)

以下是基于this link中概述的方法的公式方法。这种方法的最终布局如下所示。

Spreadsheet layout

我假设有1个标题行,我使用2个辅助列(D&amp; E)。虽然可以向标题添加其他行,但表必须从列A开始,以便E列中的公式正常工作。

虽然辅助列可以通过将它们的公式合并到F列的公式中来消除,但我不推荐它:生成的公式很难维护。

需要的公式

  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]

答案解释

获得答案有四个步骤:

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

  • 为排序成绩

  • 创建行号的部分排序
  • 获取重复成绩的行号

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

将成绩从最高到最低排序

Function to sort grade

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

部分订购成绩行号

Formulas to get grade row numbers of sorted names, with duplicates

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

为此,我使用MATCH函数查找每个排序等级位于B列未排序等级列表的位置。MATCH有三个参数 - 要匹配的值,匹配的范围,以及可选的匹配类型,精确匹配的值为0或FALSE - 并返回一个索引号,表示在查找范围内找到匹配的位置(1表示匹配范围中的第一行,第二行中的第2行等。)。

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

单元格D4的结果显示了为什么只能使用此公式获得部分排序。当我们尝试为23的等级的第二个实例查找行时,公式返回值2,这对应于第一个23的实例的行。这是因为MATCH将始终返回第一个匹配23它找到,这是在第2行!

获取重复成绩的正确行号

Formulas to get correct row numbers for duplicate grades

下一步是为D列中的重复行号获取正确的行引用。表中E列的前三个单元格显示了完成此操作的公式。

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

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

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

  3. 最后一种情况是重复成绩的行。在此,使用排除该等级的先前匹配的滑动范围重新计算B列中每个副本的MATCH。例如,对于C列中重复的等级23,匹配范围为B3:B6,而不是D列计算中使用的B2:B6范围。
  4. 按排序顺序显示名称

    Formulas to show names sorted by grade

    最后一步是直截了当:获取与排序等级相对应的名称。这里使用OFFSET函数;它的参数是一个单元格引用,以及该引用中要找到所需值的行数和列数。