含重复值的区域匹配问题:提取前三大值对应表头异常
我懂你遇到的痛点了——当数据区域里存在重复的最大值、次大值时,原来的INDEX+MATCH组合只会返回第一个匹配到的列标题,导致无法正确获取所有占比最高的三个分组名称,甚至出现重复的结果。
下面给你两种解决方案,分别适配旧版Excel和新版Excel 365:
方案1:适配Excel 365及以上(动态数组版本)
如果你的Excel支持动态数组函数,这是最简洁的解决方式,一次性就能返回前3个不重复的高占比分组:
=TAKE(UNIQUE(SORTBY($DK$2:$EG$2, DK3:EG3, -1)), 3)
公式解析:
SORTBY($DK$2:$EG$2, DK3:EG3, -1):根据DK3:EG3的数值,对DK2:EG2的列标题进行降序排序UNIQUE(...):去掉重复的列标题(如果有多个分组占比相同,只保留一次)TAKE(..., 3):提取排序去重后的前3个结果
你只需要在第一个单元格输入这个公式,Excel会自动填充到后面两个单元格,不需要分别输入三个公式。
方案2:兼容旧版Excel(非动态数组版本)
如果用的是旧版Excel,需要给三个单元格分别输入以下公式(注意是数组公式,输入后按Ctrl+Shift+Enter确认,而不是普通回车):
第一个单元格(取占比最高的分组)
=INDEX($DK$2:$EG$2, MATCH(MAX(DK3:EG3), DK3:EG3, 0))
第二个单元格(取第二高占比的分组,排除已选中的第一个)
=INDEX($DK$2:$EG$2, MATCH(1, (DK3:EG3=LARGE(DK3:EG3, 2))*(COUNTIF($F$3:F3, $DK$2:$EG$2)=0), 0))
注:这里的$F$3:F3要替换成你第一个结果所在的单元格,比如如果第一个结果在G3,就改成$G$3:G3
第三个单元格(取第三高占比的分组,排除前两个已选中的)
=INDEX($DK$2:$EG$2, MATCH(1, (DK3:EG3=LARGE(DK3:EG3, 3))*(COUNTIF($F$3:F4, $DK$2:$EG$2)=0), 0))
注:同理,$F$3:F4替换成前两个结果所在的单元格范围,比如$G$3:G4
公式解析:
(DK3:EG3=LARGE(DK3:EG3, n)):筛选出等于第n大值的所有列(COUNTIF(..., $DK$2:$EG$2)=0):排除已经在前面单元格出现过的列标题MATCH(1, ..., 0):找到同时满足两个条件的第一个列的位置
为什么原来的公式会失效?
原来的MATCH(LARGE(DK3:EG3,2), DK3:EG3,0)会直接返回第一个等于第二大值的列位置,如果第二大值和最大值相同(即存在重复的最大值),它就会和第一个公式返回同一个列标题,导致结果重复或者不符合预期。上面的方案通过排除已选结果或者动态排序去重的方式,解决了这个问题。
内容的提问来源于stack exchange,提问作者NeilD137
相关产品推荐
相关产品推荐

