2013-04-23 101 views
0

我有一个简单的表,5个名称和5个等级,如果你愿意。 在另一列中,我使用LARGE函数对等级进行排序。 现在有办法知道每个“有序”等级的行来获得类似的东西吗?提取函数结果的行号

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

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

+0

您是否试图获得分数的行,以便您可以检索该名称?是否有理由不能使用排序(在Grades列中选择第一个值并按降序排序),因为这会对值进行排序并在值旁边保留名称?你怎么知道你的“有序”栏目中的23个变成了'白色'还是那个变成'绿色'的变化? – user2140261 2013-04-23 14:49:38

+0

@ user2140261我不知道..这只是一个例子来更好地解释我的问题。最终目标是在第四栏写上名字!原因是我想要一个公式! – Janinho67 2013-04-23 16:26:50

回答

1

如果您想对这些等级进行排名,您应该使用rank()函数。不大()。

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

RankExample

+0

我认为你的调用'Grade2'是Grade1 Sorted Descending。所以,整体不需要。并且因为'Rank'不会给OP那个。通过拖拽一个公式来使用'Large' 1,2,3,4等等是一个完全有效的解决方案。 – user2140261 2013-04-23 14:44:01

+0

@ user2140261你错了。再次看看订单。 – Stepan1010 2013-04-23 14:54:58

+0

31,23,23,18,15是23,15,23,18,32的下降值。林不知道你要求我看什么顺序。另外,OP并不要求该等级的顺序,她只需要与每个等级关联的行。 “在另一列我订购了分数”,那么真正的问题是“是否有办法知道每个”有序“等级的行?她已经有了她只想知道每个”订购“等级的行的顺序来自。 – user2140261 2013-04-23 15:06:43

1

你可以试试这个

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

结果是行的数量...

+1

红色和绿色都是23.它将仅返回第一场比赛。 – user2140261 2013-04-23 14:48:52

1

细胞D1单元格D2将=INDEX($A$1:$A$5,MATCH(C1,$B$1:$B$5,0))

然后把=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()函数。我们D1进入=MATCH(C1,B1:B5,0)

Match

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

因此,当寻找匹配C131我们得到5。这就告诉我们,31是Row 5

现在,得到的Column ARow 5价值,我们使用INDEX()功能如下:

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

INDEX

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

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

Issue

这是我们的2个问题:

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)) 值不等于上面行中的值。 (作为一个排序列表意味着所有的双精度值将在彼此之上),如果它是不是相同然后使用该值,但如果它是相同的,我们需要做更多的工作。

如果该值是不一样的,我们使用公式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 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)是包含在这种情况下23C3一审排与排为Row 1,所以我们需要寻找23排在Row 1。因此我们使用MATCH(C3,INDIRECT("$B$"&MATCH(C3,$B$1:$B$5,0)+1&":$B$5"),0)等于MATCH("23", B2:B4,0),因为我们将1添加到具有第一个匹配的行23C3

,现在将回到我们的2值作为,价值23Range("A2:A5")在第二排,Red是在这个范围内的Row 3Row 1Blue如图所示:

Row2

但我们不希望Row 2我们知道,23涉及GreenGreenRow 3所以我们增加该行的最后,我们发现价值231MATCH(C3,$B$1:$B$5,0))到我们目前找到的行(2)并获得Row 3

+0

与我的第一个示例或Stepan答案中的表格相关? – Janinho67 2013-04-23 17:36:33

+0

这将返回与原始问题中“已排序”列中的数字匹配的名称。 – user2140261 2013-04-23 17:51:05

+0

我已经更新了我的答案,以包含我在这个问题中讨论过的每一件事的完整解释。 – user2140261 2013-04-23 22:21:55

0

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

Spreadsheet layout

我假定有1个标题行并且使用了两辅助列(d & 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个最大值。如图所示,单元格C2中的LARGE函数获取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,上档次的MATCH函数31只返回6自31是塔B的第六行中

细胞D4结果表明为什么它是只可能获得用这个公式进行偏序排序。当我们试图查找23的第二个实例的行时,公式返回值为2,这对应于第一个23的行。这是因为MATCH将始终返回23的第一个匹配发现,这是在第2行!

获取正确的行号为

Formulas to get correct row numbers for duplicate grades

下一步是让在列D.复制的行号是实现这一目标的公式正确的行引用显示了重复的成绩表格E栏中的前三个单元格。

有三种情况是与E栏予以处理:

  1. 对于第一个(也可能是唯一的)最高等级的情况下,可以只使用在计算行数cell D2

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

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

Diplay在有序

Formulas to show names sorted by grade

名字最后一步是直截了当:获得对应等级排序的名称。这里使用OFFSET功能;它的参数是一个单元格引用以及该引用的行和列的数量,以便找到所需的值。

+0

'INDIRECT'是一个易失性函数,应该避免,这就是为什么我使用索引。我会*不*在多个不同的公式中使用它们,这些公式都是相互引用的。这也会对性能产生很大的影响。此外,为什么在引用行时,硬编码'$ A $ 1'和'$ E $ 6'?它总是会返回'1'和'6',然后您将加上和减去硬编码的数字,这些数字总是***保持不变。 'ROW($ B $ 2)-1'将始终***结果为'1'和'&“:B”&ROW($ E $ 6)'总是等于'B6',为什么不使用这些值而不是增加额外的计算? – user2140261 2013-04-24 12:45:34