excel中提取手机号有四种方法:一、substitute与mid结合辅助列提取11位数字;二、power query按非数字拆分并筛选符合号段的11位数;三、vba正则匹配1[3-9]\d{9};四、textjoin+filterxml解析分割后筛选。

如果您在Excel中处理包含大量杂乱文本的数据,需要从中快速定位并提取手机号码,则可能是由于手机号嵌套在句子、地址或混合字符中,无法直接识别。以下是实现该目标的多种方法:
一、使用SUBSTITUTE与MID结合正则逻辑提取
该方法适用于手机号固定为11位且前后无其他11位数字干扰的场景,通过逐字符判断数字连续性,再截取最长数字串。需配合辅助列与公式组合实现。
1、在B1单元格输入公式:=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"0",""),"1",""),"2",""),"3",""),"4",""),"5",""),"6",""),"7",""),"8",""),"9",""),得到纯非数字字符串;
2、在C1输入:=LEN(A1)-LEN(B1),确认原始文本中数字总个数;
3、在D1输入:=IF(C1>=11,MID(A1,FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789"),11),""),此为简化示意,实际需数组公式配合MATCH定位起始位置;
4、按Ctrl+Shift+Enter生成数组公式,再向下填充至整列。
二、利用Power Query清洗并筛选11位数字
Power Query具备强大的文本分隔与条件筛选能力,可自动识别并保留长度为11且符合手机号号段规则(如13x/14x/15x/17x/18x/19x)的数字串,避免误提身份证后11位等干扰项。
1、选中数据列 → 数据选项卡 → “从表格/区域”导入,勾选“表包含标题”;
2、在Power Query编辑器中,选择该列 → 转换选项卡 → “拆分列” → “按非数字字符”;
3、选中所有新生成的数字列 → 右键 → “更改类型” → “整数”,错误值将标为null;
4、添加自定义列,输入公式:=if Text.Length(Text.From([Column1]))=11 and Text.Start(Text.From([Column1]),1)="1" then [Column1] else null;
5、筛选该列非空值 → 关闭并上载至工作表。
三、使用VBA函数自定义提取手机号
该方法通过编写正则表达式匹配函数,精准识别以1开头、第二位为3-9、共11位的连续数字,支持一键调用,适用于重复批量处理。
1、按Alt+F11打开VBA编辑器 → 插入 → “模块”;
2、粘贴以下代码:
Function GetMobile(str As String) As String
Dim reg As Object
Set reg = CreateObject("VBScript.RegExp")
reg.Pattern = "1[3-9]\d{9}"
reg.Global = True
If reg.Test(str) Then GetMobile = reg.Execute(str)(0).Value Else GetMobile = ""
End Function
3、返回Excel,在空白单元格输入:=GetMobile(A1);
4、向下拖拽填充,所有匹配到的首个手机号即显示在对应单元格。
四、借助TEXTJOIN与FILTERXML提取(仅限Office 365或Excel 2021)
该方法利用FILTERXML解析XML结构,将文本按非数字分割后转为节点列表,再用TEXTJOIN合并符合条件的11位数字,无需宏且公式可直接下拉复用。
1、在B1输入完整公式:=TEXTJOIN("",TRUE,FILTERXML(""&SUBSTITUTE(SUBSTITUTE(A1,"","》")&"","//b[not(contains(.,'.')) and string-length(.)=11 and starts-with(.,'1') and number(.)=number(.)]"));
2、按Enter确认,公式将自动过滤出满足11位、以1开头、纯数字的字符串;
3、若存在多个手机号,此公式默认只返回第一个;如需全部,需嵌套INDEX+SEQUENCE调整XPath路径索引。










