Excel两列分组子项转指定格式动态更新公式求助
表格分组转层级列表实现方案
以下方案支持B、C列内容变动后自动同步更新,按Excel版本选择对应实现即可:
Excel 365 / 2021 版本(支持动态数组)
仅需在E1单元格输入以下公式,即可自动溢出生成全部E、F列内容,无需下拉填充:
=LET( groups, TOCOL(UNIQUE(B:B), 1), item_list, BYROW(groups, LAMBDA(g, VSTACK(g, IFERROR(FILTER(C:C, B:B=g), "")))), grp_col, TOCOL(BYROW(groups, LAMBDA(g, VSTACK(g, IFERROR(EXPAND(g, ROWS(FILTER(C:C, B:B=g)), , g), g)))), 1), item_col, TOCOL(item_list, 1), HSTACK(grp_col, item_col) )
如果不需要保留E列的分组关联标识,仅需要生成F列,可直接在F1输入简化公式:
=TOCOL(BYROW(TOCOL(UNIQUE(B:B),1),LAMBDA(g,VSTACK(g,IFERROR(FILTER(C:C,B:B=g),"")))),1)
旧版Excel(无动态数组支持)
需分别给E、F列设置公式,手动下拉到足够覆盖最大数据量的行数即可:
- 先在空白列(如H列)提取不重复分组,H1输入公式后下拉:
=IFERROR(INDEX(B:B,MATCH(0,COUNTIF(H$1:H1,B:B),0)),"") - E列公式(下拉填充):
=IFERROR(INDEX(H:H,MATCH(TRUE,COUNTIF(E$1:E1,H:H)<(1+COUNTIF(B:B,H:H)),0)),"") - F列公式(下拉填充,数组公式需按Ctrl+Shift+Enter确认):
=IF(E2="","",IF(COUNTIF(E$1:E1,E2)=0,E2,INDEX(C:C,SMALL(IF(B:B=E2,ROW(C:C),99999),COUNTIF(E$1:E1,E2)))))
效果验证
- 每个分组在F列的第一个值自动等于分组名
- 无对应C列子项的分组,仅在F列展示分组名本身
- B、C列新增/修改/删除内容后,公式自动刷新输出结果
内容的提问来源于stack exchange,提问作者William Pontoppidan
相关产品推荐
相关产品推荐

