Excel 365动态数组:如何生成按测试分组的关联工单列表?
解决方案:纯Excel动态数组公式实现按测试分组关联工单
完全可以仅通过Excel 365的动态数组公式实现需求,以下针对两种常见展示方式给出具体公式:
前提说明
假设原始数据表A1#的结构为:
- 第1列:工单编号/名称
- 第2列及以后:该工单关联的测试项(一行可能对应多个测试)
你已通过公式生成的唯一测试列表(记为TestList),后续公式直接引用该区域即可。
方式1:每个测试对应一行,关联工单以逗号分隔
英文界面公式
=BYROW(TestList, LAMBDA(t, TEXTJOIN(", ", TRUE, FILTER(A1#[[#All],[Column1]], BYROW(EXCLUDE(A1#,,1), LAMBDA(row, ISNUMBER(XMATCH(t, row))))))))
中文界面公式
=BYROW(TestList, LAMBDA(t, TEXTJOIN(", ", TRUE, FILTER(A1#[[#All],[列1]], BYROW(排除(A1#,,1), LAMBDA(row, ISNUMBER(XMATCH(t, row))))))))
逻辑解释:
BYROW(TestList, ...):遍历每个唯一测试项BYROW(EXCLUDE(A1#,,1), LAMBDA(row, ISNUMBER(XMATCH(t, row)))):检查原始数据的每一行(仅测试列)是否包含当前测试项,返回布尔值数组FILTER(...):筛选出所有包含该测试项的工单TEXTJOIN:将筛选出的工单合并为逗号分隔的字符串
方式2:每个工单单独一行,测试项重复对应(类似透视表展开)
英文界面公式
=LET( tests, TestList, combined, REDUCE("", tests, LAMBDA(acc, t, VSTACK(acc, HSTACK(t, FILTER(A1#[[#All],[Column1]], BYROW(EXCLUDE(A1#,,1), LAMBDA(row, ISNUMBER(XMATCH(t, row))))))))), DROP(combined, 1) )
中文界面公式
=LET( 测试列表, TestList, 合并结果, REDUCE("", 测试列表, LAMBDA(acc, t, VSTACK(acc, HSTACK(t, FILTER(A1#[[#All],[列1]], BYROW(排除(A1#,,1), LAMBDA(row, ISNUMBER(XMATCH(t, row))))))))), DROP(合并结果, 1) )
逻辑解释:
LET:定义变量简化公式结构REDUCE:遍历每个测试项,将测试项与对应的工单列表垂直堆叠DROP(combined, 1):移除REDUCE初始生成的空行
关于你之前尝试的问题
你用XLOOKUP未成功是因为它默认仅返回第一个匹配项,无法获取所有关联工单;单独用BYROW未成功是缺少了FILTER批量提取匹配结果的环节,上述公式通过BYROW遍历测试项+FILTER提取全量工单的组合,完美解决分组需求。
内容的提问来源于stack exchange,提问作者MonkeyJLuffy
相关产品推荐
相关产品推荐

