Excel按条件重排单元格值并实现容器内容分组排序的函数咨询
嘿,我来帮你搞定这个需求!根据你描述的表格结构,我分两种常见情况给你解决方案:
情况一:原始数据是分两列的(更规范的结构)
假设你的表格是这样的:
| 类型(A列) | 名称(B列) |
|---|---|
| Containers | Crate |
| Contents | Apples |
| Contents | Bananas |
| Contents | Oranges |
| Containers | Barrel |
| Contents | Grapes |
| Contents | Apples |
步骤1:先给每个内容匹配对应的容器
在C2单元格输入这个公式,然后下拉填充到所有行:=SCAN("", A2:A8, LAMBDA(prev, curr, IF(curr="Containers", INDEX(B:B, ROW(curr)), prev)))
这个公式会自动把每个Contents行对应到它所属的容器,比如所有Crate的内容行,C列都会显示Crate。
步骤2:生成最终的分组排序结果
找一个空白单元格(比如D1),输入这个公式:=REDUCE("", UNIQUE(FILTER(C:C, A:A="Containers")), LAMBDA(acc, container, VSTACK(acc, container, SORT(FILTER(B:B, C:C=container AND A:A="Contents")))))
按下回车后,你就会得到想要的结果:先显示Crate,然后是按字母排序的Apples、Bananas、Oranges,接着是Barrel,然后是排序后的Apples、Grapes。
情况二:原始数据是单列的(你描述的纯纵向结构)
如果你的数据是单列排列的(A1=Containers,A2=Contents,A3=Crate,A4=Apples,A5=Bananas,A6=Oranges,A7=Barrel,A8=Grapes,A9=Apples),那先做数据结构化:
步骤1:标记容器行和内容行
在B3单元格输入公式,下拉到B9:=IF(ROW()=3, "Container", IF(OFFSET(B3, -1, 0)="Content", IF(ISNA(XMATCH(A3, A$4:A9)), "Container", "Content"), ""))
这个公式会自动标记出哪些行是容器(Container),哪些是内容(Content)。
步骤2:给内容匹配容器
在C3单元格输入公式,下拉到C9:=SCAN("", B3:B9, LAMBDA(prev, curr, IF(curr="Container", INDEX(A:A, ROW(curr)), prev)))
这样每个内容行的C列就会对应到它的容器了。
步骤3:生成最终结果
同样找空白单元格输入公式:=REDUCE("", UNIQUE(FILTER(A3:A9, B3:B9="Container")), LAMBDA(acc, container, VSTACK(acc, container, SORT(FILTER(A3:A9, C3:C9=container AND B3:B9="Content")))))
回车后就能得到分组排序好的结果了。
小提示
如果你用的是旧版Excel(没有SCAN、REDUCE这些动态数组函数),那得换用INDEX+MATCH的组合来实现,不过现在大部分人用的都是支持动态数组的版本啦,上面的公式应该能直接用~
备注:内容来源于stack exchange,提问作者Jona Vonk

