文本截取:LEFT、RIGHT、MID 和 LEN
四个函数到底各管什么

从一串文字里抠出想要的那一段,是 Excel 里出现频率极高的操作。系统导出的编码、扫描枪读进来的一长串、身份证号、带前缀的订单号、单元格里挤成一坨的地址,几乎都需要先截后算。负责这件事的四个函数是 LEFT、RIGHT、MID 和 LEN,前三个负责动手切,最后一个负责量长度。
很多人的困惑不在于不会用,而在于不知道该用哪一个。判断标准其实只有一条:你想要的那一头是固定的,还是中间的位置是固定的。如果目标在开头,用 LEFT;在结尾,用 RIGHT;在中间的某个位置,用 MID。而 LEN 通常不单独用,它是给另外三个提供位置参数的,尤其是从末尾往前数的时候。
LEFT 的语法是 =LEFT(文本, [字符个数]),第二个参数省略时默认只取一个字符。RIGHT 完全对称,语法是 =RIGHT(文本, [字符个数]),从右侧开始数。MID 稍微复杂一点,=MID(文本, 开始位置, 字符个数),三个参数一个都不能省,开始位置从一开始计数,不是从零开始,这是很多写惯了编程语言的人最容易搞错的地方。
LEN 的语法最简单,=LEN(文本),返回字符数。它有一个兄弟 LENB,返回字节数。在默认的中文环境下,一个汉字算两个字节,一个英文字母或数字算一个字节,这个差异可以用来判断字符串里有没有中文,比如 =LEN(A2)=LENB(A2) 为真就说明这一格里全是半角字符。
| 函数 | 语法 | 第二个参数含义 | 省略后果 | 典型写法 |
|---|---|---|---|---|
LEFT |
=LEFT(A2,3) |
从左边取几个字符 | 只取第一个字符 | 取订单号前缀 |
RIGHT |
=RIGHT(A2,4) |
从右边取几个字符 | 只取最后一个字符 | 取手机号后四位 |
MID |
=MID(A2,3,2) |
起始位置,从一开始 | 不可省略 | 取编码中间段 |
LEN |
=LEN(A2) |
无 | 无 | 算总长度 |
LENB |
=LENB(A2) |
无 | 无 | 判断有无中文 |
需要提前记住的一条铁律:这四个函数处理的对象一律按文本看待。哪怕单元格里是数字,LEFT(A2,3) 也会先把它当字符串切开,切出来的结果同样是文本,不能直接参与加减运算。想变回数字,要么外套 VALUE,要么乘以一,要么在前面加两个负号做一次数学运算,这三种写法在后面的问答里有详细展开。
还有一个容易被忽略的细节:这四个函数都不会改变原始数据,它们只是返回一段新的文本。如果你想真正把一列长文本改成短文本,需要用选择性粘贴把公式结果转回数值,再删掉原始列。直接在原列上写公式会形成循环引用,Excel 会弹出警告,提示你公式引用了自己所在的单元格。
另一点值得记住的是全角与半角的差异。LEN 把一个全角汉字、一个半角字母、一个全角标点都算作一个字符,它并不区分宽度。所以在用 LEFT 取固定长度时,如果数据里混着全角括号和半角括号,取出来的视觉宽度会参差不齐,但字符数是对的。遇到按显示宽度对齐的需求,比如生成固定宽度的报表文本,就需要额外处理,单纯靠 LEN 是做不到的。
从末尾往前数与按分隔符定位
RIGHT 只能从右边数固定位数,可实际数据里经常遇到的是去掉最后三位剩下的部分,或者去掉前两个字符剩下的部分。这类需求要用到 LEN 配合 LEFT 或 RIGHT,这是本篇最值得背下来的一组组合。
去掉末尾三个字符:
=LEFT(A2,LEN(A2)-3)
去掉开头两个字符:
=RIGHT(A2,LEN(A2)-2)
去掉首尾各一个字符:
=MID(A2,2,LEN(A2)-2)
这三个写法的共同思路是:先用 LEN 算出总长度,再减去要砍掉的部分,把结果交给截取函数当长度参数。理解了这个思路,你就能应对任何去掉固定头尾的需求,不用再去死记硬背一堆具体公式。
长度固定的字符串好办,麻烦的是长度不固定的。比如“张三-销售部-上海”和“欧阳明日-技术支持部-深圳”,你要取出中间的部门,用固定位置截取必然失败。这时候要靠定位函数先找到分隔符的位置。
FIND 和 SEARCH 的作用都是返回某个字符在字符串里第一次出现的位置,区别有三点:FIND 区分大小写且不支持通配符,SEARCH 不区分大小写且支持 ? 和 * 两个通配符。处理中文数据时两者几乎没有差别,随便用哪个都行,处理英文编码时按是否需要区分大小写来选。
取出第一个分隔符之前的部分:
=LEFT(A2,FIND("-",A2)-1)
取出第一个和第二个分隔符之间的部分:
=MID(A2,FIND("-",A2)+1,FIND("-",A2,FIND("-",A2)+1)-FIND("-",A2)-1)
第二个公式看起来吓人,但拆开看很清楚:FIND("-",A2) 找到第一个分隔符的位置,加一就是部门名的起点;FIND("-",A2,FIND("-",A2)+1) 的第三个参数表示从第一个分隔符之后开始找,于是找到的是第二个分隔符的位置;两者相减再减一,就是部门名的长度。
取出最后一个分隔符之后的部分稍微麻烦一点,因为 FIND 只能从左往右找。通用做法是用 SUBSTITUTE 把最后一个分隔符替换成一个别的字符,再定位它:
=RIGHT(A2,LEN(A2)-FIND("@",SUBSTITUTE(A2,"-","@",LEN(A2)-LEN(SUBSTITUTE(A2,"-","")))))
这个写法的原理是:LEN(A2)-LEN(SUBSTITUTE(A2,"-","")) 算出分隔符一共出现了几次,然后 SUBSTITUTE 的第四个参数指定只替换第几次出现的那一个,于是最后一个分隔符被换成了 @,再用 FIND 找它就不会找错。这里选 @ 是因为它在原始数据里通常不会出现,如果可能出现就换一个更冷门的符号。
如果 LEN(A2)-3 这类计算结果是负数或者零,LEFT 会返回空文本而不会报错,这既是好事也是坏事。好处是整列填充时不会因为个别短数据而崩掉,坏处是你会拿到一片看起来合理的空白,很难发现是哪几行出了问题。所以处理完最好用 LEN 再抽查一次结果长度。
真实场景:身份证号与层级编码

从十八位身份证号取出信息
十八位身份证号是文本截取的经典案例,因为它把好几项信息按固定位置编在了一串数字里。第七位到第十四位是出生日期,第十七位是性别码,奇数为男偶数为女。
取出出生日期并转成真正的日期:
=DATE(MID(A2,7,4),MID(A2,11,2),MID(A2,13,2))
这里连续用了三次 MID,分别取出年、月、日,再交给 DATE 拼成日期。千万不要只用一次 MID(A2,7,8) 取出 19920315 就以为完事了,那依然是文本,没法做日期运算。
取出性别:
=IF(MOD(MID(A2,17,1),2)=1,"男","女")
这里 MID 取出来的是文本型的数字,MOD 会自动把它转成数字做求余运算,所以可以直接用。如果你担心兼容性,可以写成 =IF(MOD(VALUE(MID(A2,17,1)),2)=1,"男","女"),多套一层 VALUE 更保险。
取出出生年份用于年龄分档,可以写成 =YEAR(TODAY())-MID(A2,7,4)。十五位的老式身份证号要先把出生年份补成四位,写法是在前面接上 19,即 =DATE("19"&MID(A2,7,2),MID(A2,9,2),MID(A2,11,2))。处理老数据时最好先用 LEN 判断一下位数,写成 =IF(LEN(A2)=18,十八位的写法,十五位的写法),这样两种数据混在一列里也不会出错。
顺带一提,拿到出生日期之后要算周岁年龄或者算工龄,就要用到日期推算函数,那部分内容在 日期推算:EDATE、EOMONTH、DATEDIF、NETWORKDAYS 里有完整讲法,两篇配合着看效果最好。
取出括号里的内容
商品名称里经常带着括号备注,比如“笔记本电脑(i7/16G)”和“显示器(27寸)”,客户要求把括号里的规格单独列出来。这类需求的特点是左右括号位置都不固定,只能靠定位函数来算。
取出左括号之后、右括号之前的那一段:
=MID(A2,FIND("(",A2)+1,FIND(")",A2)-FIND("(",A2)-1)
这里用的是全角括号。如果数据里混着半角括号,公式就找不到目标,会返回 #VALUE!。稳妥做法是先统一,用 SUBSTITUTE 把半角括号换成全角,再套上面的公式。同理,如果有些行根本没有括号,就要用 IFERROR 兜底返回原值,写成 =IFERROR(MID(...),A2)。
去掉括号及其内容,只保留主名称:
=TRIM(LEFT(A2,FIND("(",A2)-1))
外层套 TRIM 是为了去掉括号前可能残留的空格。这两个公式配合使用,一列存主名称、一列存规格备注,后续的筛选和透视就都能正常做了。
处理系统导出的层级编码
很多 ERP 和财务系统导出的是层级编码,比如 01-02-0035 代表一级科目零一、二级科目零二、三级明细三十五。这类编码的段位长度往往不统一,前两段固定两位,最后一段可能是三位也可能是四位。
取出第一段:
=LEFT(A2,2)
取出最后一段,不管它有几位:
=RIGHT(A2,LEN(A2)-6)
因为前面的 01-02- 一共占六位,用总长度减六就拿到了末尾部分。但更稳妥的写法是明确给出起点,万一中段变成了三位也不会错位:=MID(A2,7,LEN(A2)-6)。
判断编码层级是否合规,可以用长度加上分隔符数量来验证:
=IF(LEN(A2)-LEN(SUBSTITUTE(A2,"-",""))=2,"层级正确","缺段")
这个公式用替换前后长度之差算出分隔符的个数,等于二就说明是标准的三段编码。这是文本处理里非常实用的一条技巧,凡是涉及统计某个字符出现次数的场景,都可以套用这个长度差的写法。
常见错误与兼容提示
截取结果少一个字符,是最常见的反馈。原因几乎都是把起始位置当成了从零开始,或者忘了减一。记住:FIND 返回的是分隔符所在的位置,而你要的是它前面的内容,所以长度参数要减一;MID 的起始位置要跳过分隔符,所以要加一。这一加一减最容易搞混,写完之后拿一个已知结果的行验算一遍。
截取出来是数字却算不了,是因为结果是文本。判断方法很简单,看单元格里是靠左还是靠右,文本默认靠左,数字默认靠右。修法有三种:外套 =VALUE(LEFT(A2,3))、乘以一 =LEFT(A2,3)*1、或者用双负号 =--LEFT(A2,3)。三种写法效果相同,第三种最短,第二种最容易理解。
截取结果里带着看不见的空格,导致后续的查找匹配失败。这通常是数据源的问题,不是截取函数的问题。解决办法是在截取外面再套一层 TRIM,写成 =TRIM(MID(A2,3,2))。清洗相关的完整手法参见 文本清洗:TRIM、CLEAN、SUBSTITUTE、REPLACE。
FIND 找不到目标时返回 #VALUE!,整条公式就废了。如果需要容错,用 IFERROR 包一层:=IFERROR(LEFT(A2,FIND("-",A2)-1),A2),意思是找不到分隔符就返回原值。这在数据不规整时非常有用,能让你的公式在面对脏数据时依然给出可用的结果。
截取之后如果要拼回完整的一串,比如把省市区重新合并,就要用到连接符或者 TEXTJOIN,那部分内容在 文本拼接:连接符、CONCAT 和 TEXTJOIN 里有详细对比。截取与拼接是一对互逆操作,日常处理数据时往往是交替使用,先把不要的切掉,再把要的按新格式拼起来。
版本兼容性
LEFT、RIGHT、MID、LEN 这四个函数属于最古老的一批函数,从 Excel 2003 到 Microsoft 365,从 WPS 个人版到专业版,行为完全一致,可以放心使用,不需要考虑任何版本差异。LENB 在 WPS 里的表现与 Excel 略有不同,主要体现在双字节字符集的判定上,如果用它来判断中文,建议先在目标环境里用一个已知字符串验证一次。
FIND 和 SEARCH 同样全版本通用,但要注意 WPS 在某些语言环境下对 SEARCH 的通配符支持有细微差异。稳妥做法是:不需要通配符时一律用 FIND,需要通配符时也尽量用 FIND 配合 ISNUMBER 来判断,这样跨平台时行为最一致。
另外要提醒的是,涉及身份证号这类长数字串时,务必在录入前把单元格格式设为文本,或者在输入时先敲一个英文单引号。否则 Excel 会把十八位数字自动转成科学计数法,后三位变成零,这时候不管用什么截取函数都救不回来,只能重新录入原始数据。
常见问题
为什么 MID 的第二个参数写 0 会报错
MID 的起始位置参数必须大于等于一,写零或者负数会直接返回 #VALUE!。这是 Excel 的设计,与很多编程语言从零开始计数的习惯不同。如果你算出来的起始位置有可能小于一,用 MAX 兜一下底:=MID(A2,MAX(1,3),5),确保最小是一。同样地,第三个字符个数参数也不能是负数,遇到动态计算时建议也用 MAX 包一层,写成 =MID(A2,3,MAX(0,LEN(A2)-5))。
怎么把截取出来的文本数字变成真数字
三种写法任选其一,效果完全一样:外套 VALUE 函数、乘以一、或者在前面加两个负号。推荐第二种和第三种,因为敲起来快:
=--MID(A2,3,4)
=MID(A2,3,4)*1
=VALUE(MID(A2,3,4))
如果转换之后还是不对,检查截取结果里有没有隐藏的空格或者全角字符。可以先用 LEN 看长度,比如 1234 的长度应该是四,如果显示五就说明多了一个字符,需要先用 TRIM 或 SUBSTITUTE 清理,具体手法参见 文本清洗:TRIM、CLEAN、SUBSTITUTE、REPLACE。
怎么统计某个字符在字符串里出现了几次
用长度差是最简洁的做法,原理是先算原字符串长度,再算把目标字符全部删掉之后的长度,两者相减就是出现次数:
=LEN(A2)-LEN(SUBSTITUTE(A2,"-",""))
如果要统计的是两个字符组成的串,减完之后还要除以二,因为删掉一次会减少两个长度。这个方法同样适用于统计某个词出现的次数,是文本处理里最常用的一条组合技,配合 FIND 的定位能力,几乎能解决所有按分隔符切分的问题。
取出最后一个分隔符之后的内容,公式为什么要那么长
因为 FIND 只能从左往右找第一次出现的位置,没法直接说找最后一次。绕路的办法是用 SUBSTITUTE 的第四个参数,把第 n 次出现的分隔符换成一个特殊字符,其中 n 等于分隔符的总出现次数,于是被换掉的正好是最后一个,再用 FIND 定位它就准确了。完整写法已经在正文中给出。如果你的版本支持 TEXTAFTER,可以写得更短,但这个函数目前只在 Microsoft 365 里有,WPS 和老版本 Excel 都不支持,发给别人打开大概率会变成 #NAME?,所以稳妥起见还是用兼容写法。
截取后填充整列,为什么有的行是空的
通常有三个原因。一是那一行的原始数据本身比公式预期的短,导致 LEN 减去一个较大的数之后变成负数,LEFT 遇到负数长度就返回空。二是原始数据里有合并单元格,只有左上角那格有内容,往下填充自然全是空。三是数据看起来有内容,其实是公式返回的空字符串。排查的办法是加一列 =LEN(A2) 看真实长度,再对照公式里的期望值,问题基本就现形了。
