如何按源表格结果分类列,以结果为静态列头并返回源表头(处理重复结果)
嘿,我完全懂你的困扰!想把源表格里的「结果」转成新表格的静态列头,再把源表格的「表头」对应塞进去,还得处理同一个结果对应多个表头的情况,试了INDEX+MATCH好几次都没捋顺对吧?别慌,我给你拆解个实用的解决方案~
先明确下咱们的目标(结合你附的图,我大概还原下数据结构):
假设源表格(Table 1)是这样的:
| 源表头(Column A) | 结果(Column B) |
|---|---|
| Header 1 | Result X |
| Header 2 | Result Y |
| Header 3 | Result X |
| Header 4 | Result Z |
| Header 5 | Result Y |
我们要做的新表格,是把Result X、Result Y、Result Z作为静态列头,下面分别列出对应的源表头,像这样:
| Result X | Result Y | Result Z |
|---|---|---|
| Header 1 | Header 2 | Header 4 |
| Header 3 | Header 5 |
第一步:提取不重复的结果作为静态列头
如果你的Excel是365/2021及以上版本,直接用UNIQUE函数就能快速搞定:
在新表格的第一行(比如A1单元格)输入:=UNIQUE(Table1[结果])
回车后就会自动列出所有不重复的结果,接着选中这些列头,右键「复制」→「粘贴为值」,这样列头就固定成静态的啦,不会随源数据变化。
要是你用的是旧版Excel(没有UNIQUE函数),可以用这个数组公式(输入后按Ctrl+Shift+Enter),然后右拉直到出现错误值,再把错误单元格清空:=INDEX(Table1[结果], MATCH(0, COUNTIF($A$1:A1, Table1[结果]), 0))
第二步:匹配对应源表头并处理重复结果
方法1:适合全版本Excel(INDEX+SMALL+IF)
在新表格的第一个数据单元格(比如A2)输入这个数组公式(旧版按Ctrl+Shift+Enter,365版直接回车):=IFERROR(INDEX(Table1[源表头], SMALL(IF(Table1[结果]=$A$1, ROW(Table1[结果])-MIN(ROW(Table1[结果]))+1), ROWS($A$2:A2))), "")
然后下拉这个公式,就能把所有对应Result X的源表头依次列出来,没有更多匹配时会显示空白。
给你拆解开讲下这个公式的逻辑:
IF(Table1[结果]=$A$1, ROW(Table1[结果])-MIN(ROW(Table1[结果]))+1):找出所有结果等于当前列头(A1)的行,返回它们在源数据区域内的相对行号,不匹配的返回FALSESMALL(..., ROWS($A$2:A2)):依次提取第1、2、3...个匹配的行号,对应第一个、第二个、第三个源表头INDEX根据行号提取对应的源表头IFERROR用来处理没有更多匹配时显示空白,避免出现错误值
方法2:适合Excel 365/2021(FILTER+TOCOL,更简洁)
如果你的版本支持动态数组,直接用这个公式就行,输入后会自动填充所有匹配的内容,不用下拉:=TOCOL(FILTER(Table1[源表头], Table1[结果]=$A$1), 2)
FILTER会筛选出所有结果等于A1的源表头TOCOL把筛选结果转成单列,2参数表示忽略空值
小提示
- 一定要把列头粘贴为值,确保是静态的,不然源数据更新时列头可能会变
- 如果源数据有新增行,只需要下拉公式(或者在365版里公式会自动更新)就能同步新的内容
备注:内容来源于stack exchange,提问作者David Decator

