(Excel) 如何用公式计算第 n 个最高值的 return 列 header
(Excel) How to return column header of the nth highest values with formula
给定一个 table 如下所示:
David
Mike
Lisa
David
50
10
40
Mike
0
50
50
Lisa
10
40
50
我正在尝试设计一列可以自动排名和标记的公式和信息。请参阅下面的正确输出示例。
Chosen Row ->
Mike (this cell is defined by the user)
Rank
Number
Mike
50
Lisa
50
David
0
基本上,用户应该能够更改右上角的单元格,并让 table 的其余部分根据该输入自动调整。
在这里,用户在单元格中输入“Mike”,因此公式应该查看标记为“Mike”的行(值依次为 0、50 和 50)并告诉我一个列表得分最高的列名称及其得分。
唯一让我感到困惑的是将某些东西整合到公式中,使其跳过已经放入排名列表的名称。如您所见,那里有 2 个分数是 50。
Microsoft 网站上有一个关于处理关系的页面,但我没有完全理解他们使用 Countif 的示例,因此我无法出于我的目的对其进行翻译。在他们的示例中,他们还在名称左侧使用排名数字,但我希望尽可能不要这样做。如果 auto-fill 在某些方面对我没有帮助,我不介意手写单元格公式。
我知道有一种方法可以做到这一点。我玩过这些公式并做了很多研究。我正打算在 VBA 中对所有内容进行编码,但我觉得这样的工作量会大得多。在这一点上我是如此接近,我觉得我只是缺少一个关键要素。
如果 Office 365 中有动态公式,那么我们可以使用 SORT:
=SORT(CHOOSE({1,2},TRANSPOSE(B1:D1),TRANSPOSE(INDEX(B2:D4,MATCH(H1,A2:A4,0),0))),2,-1)
并且 Excel 会正确地溢出结果。
对于年长者,我们需要两个公式:
首先按顺序获取值:
=LARGE(INDEX($B:$D,MATCH($H,$A:$A,0),0),ROW(ZZ1))
将其放入 H2 并复制下来。
然后我们需要引用这些值来获得正确的名称:
=INDEX($B:$D,AGGREGATE(15,7,(COLUMN(INDEX($B:$D,MATCH($H,$A:$A,0),0))-MIN(COLUMN(INDEX($B:$D,MATCH($H,$A:$A,0),0)))+1)/(INDEX($B:$D,MATCH($H,$A:$A,0),0)=H2),COUNTIF($H:H2,H2)))
将其放入G2并复制下来。
我在 excel 2016 年制作,但我认为它适用于所有版本。首先我创建了一个 Rank,然后我使用了 Index 函数。在此处下载文件:
https://1drv.ms/x/s!Apn_2zN0NfqFhWT-OdNazVTlxI2n?e=WsZLuH
使用数组公式的排名代码:
=MATCH(LARGE(INDIRECT("B"&$K&":D"&$K)+COLUMN(INDIRECT("B"&$K&":D"&$K))/100000,ROW()-2),
INDIRECT("B"&$K&":D"&$K)+COLUMN(INDIRECT("B"&$K&":D"&$K))/100000,0)
给定一个 table 如下所示:
David | Mike | Lisa | |
---|---|---|---|
David | 50 | 10 | 40 |
Mike | 0 | 50 | 50 |
Lisa | 10 | 40 | 50 |
我正在尝试设计一列可以自动排名和标记的公式和信息。请参阅下面的正确输出示例。
Chosen Row -> | Mike (this cell is defined by the user) |
---|---|
Rank | Number |
Mike | 50 |
Lisa | 50 |
David | 0 |
基本上,用户应该能够更改右上角的单元格,并让 table 的其余部分根据该输入自动调整。
在这里,用户在单元格中输入“Mike”,因此公式应该查看标记为“Mike”的行(值依次为 0、50 和 50)并告诉我一个列表得分最高的列名称及其得分。
唯一让我感到困惑的是将某些东西整合到公式中,使其跳过已经放入排名列表的名称。如您所见,那里有 2 个分数是 50。
Microsoft 网站上有一个关于处理关系的页面,但我没有完全理解他们使用 Countif 的示例,因此我无法出于我的目的对其进行翻译。在他们的示例中,他们还在名称左侧使用排名数字,但我希望尽可能不要这样做。如果 auto-fill 在某些方面对我没有帮助,我不介意手写单元格公式。
我知道有一种方法可以做到这一点。我玩过这些公式并做了很多研究。我正打算在 VBA 中对所有内容进行编码,但我觉得这样的工作量会大得多。在这一点上我是如此接近,我觉得我只是缺少一个关键要素。
如果 Office 365 中有动态公式,那么我们可以使用 SORT:
=SORT(CHOOSE({1,2},TRANSPOSE(B1:D1),TRANSPOSE(INDEX(B2:D4,MATCH(H1,A2:A4,0),0))),2,-1)
并且 Excel 会正确地溢出结果。
对于年长者,我们需要两个公式:
首先按顺序获取值:
=LARGE(INDEX($B:$D,MATCH($H,$A:$A,0),0),ROW(ZZ1))
将其放入 H2 并复制下来。
然后我们需要引用这些值来获得正确的名称:
=INDEX($B:$D,AGGREGATE(15,7,(COLUMN(INDEX($B:$D,MATCH($H,$A:$A,0),0))-MIN(COLUMN(INDEX($B:$D,MATCH($H,$A:$A,0),0)))+1)/(INDEX($B:$D,MATCH($H,$A:$A,0),0)=H2),COUNTIF($H:H2,H2)))
将其放入G2并复制下来。
我在 excel 2016 年制作,但我认为它适用于所有版本。首先我创建了一个 Rank,然后我使用了 Index 函数。在此处下载文件:
https://1drv.ms/x/s!Apn_2zN0NfqFhWT-OdNazVTlxI2n?e=WsZLuH
使用数组公式的排名代码:
=MATCH(LARGE(INDIRECT("B"&$K&":D"&$K)+COLUMN(INDIRECT("B"&$K&":D"&$K))/100000,ROW()-2),
INDIRECT("B"&$K&":D"&$K)+COLUMN(INDIRECT("B"&$K&":D"&$K))/100000,0)