批量拆分与合并文本:TEXTSPLIT 与 TEXTJOIN
分列 是一次性操作,改一次要重做一次。TEXTSPLIT(拆)和 TEXTJOIN(合)是公式,源数据变了结果跟着变,适合做成模板。
一、TEXTSPLIT 拆文本
基本用法:
=TEXTSPLIT(A2,"、")
A2 是 张三、李四、王五,结果横向溢出到三个单元格,形成动态数组。这是 365/2021 版本的行为,会自动向右溢出,不用拖动。
按行拆,加第四个参数:
=TEXTSPLIT(A2,, "、")
第二个参数是列分隔符,第三个是行分隔符。留空表示不用。
多个分隔符同时生效,用数组常量:
=TEXTSPLIT(A2,{",","、",";"})
二、拆成多行多列
A2 是 张三,90;李四,85;王五,78,逗号分列、分号分行:
=TEXTSPLIT(A2,",",";")
得到 3 行 2 列的区块,一次成型。
忽略空值:
=TEXTSPLIT(A2,"、",,TRUE)
第四参数 TRUE 表示跳过连续分隔符产生的空项。
三、TEXTJOIN 合文本
=TEXTJOIN("、",TRUE,A2:A10)
两个要点:
- 第二参数
TRUE表示忽略空单元格; - 结果是一个文本,不是数组。
按条件合并,配合 IF 数组:
=TEXTJOIN("、",TRUE,IF($B$2:$B$100=D2,$C$2:$C$100,""))
这是把"某部门的所有人名"拼成一格的标准写法。老版本需要 Ctrl+Shift+Enter。
四、拆完再合:清洗的常见组合
原始 A、B、C、A 去重后合并:
=TEXTJOIN("、",TRUE,UNIQUE(TEXTSPLIT(A2,"、")))
排序后合并:
=TEXTJOIN("、",TRUE,SORT(TEXTSPLIT(A2,"、")))
按数字大小排序(比如 2、10、1 要排成 1、2、10):
=TEXTJOIN("、",TRUE,SORT(--TEXTSPLIT(A2,"、"),1,1))
注意 -- 把文本转数值再排序,否则 10 会排在 2 前面。
五、拆出的结果怎么落地
动态数组是"活"的,源单元格一变就重算。要固定下来:
- 选中溢出区域;
- 复制;
- 原地选择性粘贴"值"。
直接粘贴到别处再删源数据会报 #SPILL! 或 #REF!,先转值最稳。
溢出被挡住的报错 #SPILL!,原因是右侧或下方有内容。清空溢出目标区域即可,不用改公式。
六、和分列的分工
| 场景 | 选谁 |
|---|---|
| 一次性整理,源数据不再变 | 分列,快 |
| 要做成模板反复用 | TEXTSPLIT |
| 需要按条件合并 | TEXTJOIN |
| 拆分后还要去重、排序 | 函数组合 |
| 拆成不固定列数 | TEXTSPLIT,分列要手数 |
分列还有一个隐患:它会覆盖右侧单元格,而且没有撤销提示。函数方案天然安全。
七、常见坑
#NAME?:版本不支持,365/2021 才有这两个函数。WPS 需较新版本。#SPILL!:溢出区域被占用,清空右下方向即可。TEXTJOIN结果超出 32767 字符:单元格上限,只能分多列输出。- 合并后无法再筛选:合并结果是一整串文本,需要保留明细就另建表。
- 拆出的数字仍是文本:
TEXTSPLIT输出文本,外面套--或VALUE。
八、速查
| 需求 | 公式 |
|---|---|
| 按单分隔符拆 | =TEXTSPLIT(A2,"、") |
| 多分隔符 | =TEXTSPLIT(A2,{",","、"}) |
| 拆行列 | =TEXTSPLIT(A2,",",";") |
| 忽略空项 | =TEXTSPLIT(A2,"、",,TRUE) |
| 合并 | =TEXTJOIN("、",TRUE,A2:A10) |
| 条件合并 | =TEXTJOIN("、",TRUE,IF(B:B=D2,C:C,"")) |
TEXTSPLIT + TEXTJOIN 的价值不在单个函数,而在于它们能和 UNIQUE、SORT、FILTER 串起来,把以前要写 VBA 的活儿用公式做完。