从系统导出的数据,十有八九是"一坨"——姓名工号挤在一格、手机号带空格、大小写混乱。这篇讲 LEFT/MID/RIGHT/FIND/TEXTSPLIT 怎么把它们拆干净。
=LEFT(文本, 取几个字符) =RIGHT(文本, 取几个字符) =MID(文本, 从第几个开始, 取几个)
用途从一段文字里,切出你要的那一部分。
从系统里导出的数据,十有八九长这样:
张三-技术部-13812345678
李四-市场部-13987654321姓名、部门、手机号全挤在一个格子里。
或者长这样:
北京市朝阳区 (前面有空格)看起来一样,其实不一样。
这就是文本函数要解决的事。
先认清三个切刀
| 函数 | 作用 | 例子 | 结果 |
|---|---|---|---|
| `LEFT` | 从左往右切 | `LEFT("张三-技术部", 2)` | 张三 |
| `RIGHT` | 从右往左切 | `RIGHT("张三-技术部", 3)` | 技术部 |
| `MID` | 从中间某处切 | `MID("张三-技术部", 4, 3)` | 技术部 |
关键关键认知:三个函数都是按"字符个数"切的。所以你必须先知道"切几个"。
那如果不知道呢?就用 FIND 先找位置。
FIND:先找分隔符的位置
=FIND("-", A2)
在 A2 里找第一个 `-`,返回它的位置。
`张三-技术部-13812345678` 里,第一个 `-` 在第 3 个字符位置。
有了这个位置,就能算"该切几个"了。
提取"第一个横线之前"的内容(姓名)
=LEFT(A2, FIND("-", A2)-1)
逻辑:找到横线在第 3 位,那么姓名就是左边 2 个字符(3−1)。
`-1` 是因为横线本身不算。
提取"最后一个横线之后"的内容(手机号)
手机号固定 11 位,直接:
=RIGHT(A2, 11)
或者更通用(如果号码长度不固定):
=MID(A2, FIND("@", SUBSTITUTE(A2,"-","@",2))+1, 99)
这个写法有点绕,解释一下:
- `SUBSTITUTE(A2,"-","@",2)` —— 把第 2 个横线换成 `@`
- `FIND("@", ...)` —— 找到 `@`(也就是原第 2 个横线)的位置
- `MID(..., 位置+1, 99)` —— 从这个位置往后取 99 个字符(多取无害,超出部分自动忽略)
关键这是"取最后一个分隔符之后"的经典套路。本来需要 `FIND("-", A2, FIND("-",A2)+1)` 嵌套,用 SUBSTITUTE 更清晰。
中间那段(部门)
=MID(A2, FIND("-",A2)+1, FIND("@",SUBSTITUTE(A2,"-","@",2))-FIND("-",A2)-1)
长得吓人,但拆开就是:从第一个横线后一位开始,取到第二个横线前一位。
更好的办法:分列
如果这种拆分经常做,别写公式,用「数据 → 分列」。
选中列 → 数据 → 分列 → 分隔符号 → 勾"其他"填 `-` → 完成。
一步拆成三列。比公式快十倍,而且不会有公式维护问题。
关键唯一的缺点是它不动态——源数据变了要重做。所以要"一次性的活"用分列,"持续更新的表"用公式。
365 专属:一个函数搞定(TEXTSPLIT)
如果你用的是 Microsoft 365 或 Excel 2021:
=TEXTSPLIT(A2, "-")
直接按 `-` 拆成一排,自动溢出到右边三个格子。
要按行拆就加第三个参数:
=TEXTSPLIT(A2, "-", , TRUE)
这一条能省掉上面那一堆嵌套。 但同样,版本不兼容——发给用 2016 的同事会显示 `#NAME?`。
清洗脏数据:四个必会的
1. 去空格:TRIM
=TRIM(A2)
去掉首尾空格,中间的连续空格压成一个。
易错注意:TRIM 只能去掉普通空格(ASCII 32)。从网页复制来的空格可能是"不间断空格"(`CHAR(160)`),TRIM 去不掉。要用:
=TRIM(SUBSTITUTE(A2, CHAR(160), " "))
2. 统一大小写
=UPPER(A2) → 全大写
=LOWER(A2) → 全小写
=PROPER(A2) → 每个单词首字母大写
3. 替换
=SUBSTITUTE(A2, "旧", "新")
比如把所有"元"去掉:
=SUBSTITUTE(A2, "元", "")
换成真正的数字:
=--SUBSTITUTE(A2, "元", "")
4. 文本转数字
=VALUE(A2)
=--A2
两个都行,`--` 更短。
实战:清洗一列手机号
原始数据可能长这样:
138 1234 5678
138-1234-5678
+8613812345678统一成 11 位纯数字:
=RIGHT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(TRIM(A2)," ",""),"-",""),"+86",""), 11)
拆解:
- `TRIM` 去首尾空格
- 连着三次 `SUBSTITUTE` 去掉空格、横线、`+86`
- `RIGHT(..., 11)` 取最后 11 位
关键最后一步用 `RIGHT` 而不是直接返回,是为了兜住"+86"这种前缀。取后 11 位一定是对的。
判断包含:FIND 和 SEARCH 的区别
=ISNUMBER(FIND("技术", A2))
返回 TRUE 表示包含"技术"。
FIND 和 SEARCH 的区别只有一个:大小写。
- `FIND("a", "ABC")` → `#VALUE!`(区分大小写,找不到)
- `SEARCH("a", "ABC")` → 1(不区分)
关键中文没有大小写问题,两者结果一样。但处理英文、邮箱、型号时要留意。
常犯错误
| 现象 | 原因 | 解决 |
|---|---|---|
| `#VALUE!` | FIND 找不到字符 | 套 IFERROR |
| 切出来的字少了 | 忘了 `-1` | 减掉分隔符本身 |
| 中文切出乱码 | 用了 LENB/LEFTB | 改用 LEN/LEFT |
| 数字变文本 | 结果带引号 | 用 `--` 转换 |
| 空格去不掉 | 是不间断空格 | `SUBSTITUTE(...,CHAR(160)," ")` |
关键关于 LENB / LEFTB:这些是"按字节"的旧函数,只在极老的双字节系统里有意义。现在的 Excel 中文版里,一个汉字算一个字符,用 LEN / LEFT 就对了,别用带 B 的。
一句话总结
LEFT/RIGHT/MID 是按个数切,FIND 是找位置,SUBSTITUTE 是替换。定长用切刀,不定长用 FIND 找位置,一次性的活用分列。
关键文本函数的价值不在单个,在组合。真正的活往往是"去空格 → 替换 → 截取 → 转换"四步连起来,写成一条长公式。写的时候别一次写完,一段一段试。
评论 0