如何基于唯一值将多行数据合并为单行多列(动态公式实现)
Excel动态合并对应唯一值的多行多列内容
场景1:将对应行的所有列内容合并为单个字符串
如果你希望把每个唯一值对应的所有行的BA:BG列内容合并成一个字符串(每行内容用逗号分隔,不同行用竖线区分),可以用以下动态数组公式:
=HSTACK( SORT(UNIQUE(AZ4:AZ), 1, FALSE), BYROW( SORT(UNIQUE(AZ4:AZ), 1, FALSE), LAMBDA(val, TEXTJOIN(" | ", TRUE, BYROW( FILTER(BA4:BG, AZ4:AZ=val), LAMBDA(row, TEXTJOIN(", ", TRUE, row)) ) ) ) ) )
公式拆解:
SORT(UNIQUE(AZ4:AZ), 1, FALSE):你的原公式,提取AZ列降序排列的唯一值HSTACK:将唯一值列与合并内容列横向拼接成完整数组BYROW(...LAMBDA(val, ...)):逐个遍历每个唯一值,处理对应行的合并逻辑FILTER(BA4:BG, AZ4:AZ=val):筛选出AZ列等于当前唯一值的所有行的BA-BG区域BYROW(...LAMBDA(row, ...)):把筛选出的每一行的多列内容用逗号分隔合并为单条字符串TEXTJOIN(" | ", TRUE, ...):把所有行的合并字符串用竖线分隔,最终合并为一行内容
场景2:将每列的对应值单独合并(保留列结构)
如果需要保留BA-BG的列结构,每个列下合并对应唯一值的所有行数据,可以用LET函数简化公式逻辑:
=LET( unique_vals, SORT(UNIQUE(AZ4:AZ), 1, FALSE), target_cols, BA4:BG, HSTACK( unique_vals, BYCOL( target_cols, LAMBDA(col, BYROW( unique_vals, LAMBDA(val, TEXTJOIN(", ", TRUE, FILTER(col, AZ4:AZ=val))) ) ) ) ) )
公式拆解:
LET:定义变量unique_vals(唯一值数组)和target_cols(待合并的列区域),让公式更易读BYCOL(...LAMBDA(col, ...)):逐个遍历BA-BG的每一列BYROW(...LAMBDA(val, ...)):对每个列,遍历所有唯一值,筛选并合并对应行的该列数据HSTACK:将唯一值列与所有合并后的列拼接成完整的动态数组
注意事项:
- 适用版本:需要Excel 365、Excel 2021或更高版本(支持动态数组、LAMBDA系列函数)
- 自定义分隔符:修改
TEXTJOIN的第一个参数即可调整分隔符(比如把", "换成";"," | "换成"\n"实现换行) - 空值处理:
TEXTJOIN的第三个参数TRUE会自动忽略空值,改为FALSE则保留空值位置
内容的提问来源于stack exchange,提问作者Ranjan Kumar Singh
相关产品推荐
相关产品推荐

