批量提取手机\固话 正则搭配VBA迎刃而解
批量提取单元格中的中文 呼叫正则
点击上方“Excel和VBA”,选择“置顶公众号”
致力于原创分享Excel的相关知识,源码,源文件打包提供
一起学习,一起进步~~
之前我们也是学习了一些关于单元格的提取的方法,在之前的单元格内容的提取中,我们主要用的方法是正则,正则和VBA的搭配,在提取单元格的操作中还是非常实用的
上一节我们说要提取一些比较实用但又稍微有一些复杂的内容,那么是什么呢?比方说联系电话,联系电话又分为手机和固话两种形式,今天我们将两种形式放在一起来讲解下
场景说明
我们今天重新构造一个场景,如下
我们先来分析下,怎么实现,方法肯定已经锁定正则了,现在需要考虑的就是正则要如何来写
首先手机号码,我们都知道一共有11位,那么也就是说我们只需要将上述单元格中,长度为11位的数字提取出来就可以了
然后固话,要想提取固话,我们需要知道固话的组成和结构,区号+号码,这里又细分为两种,去过区号是3位,那么后面的号码就是8位,如果区号是4位,后面的号码就是7~8位
有了这个思路之后,要实现起来就比较的简单了,来看下代码
代码区
Sub tel()
Dim rng As Range, a As Range
Set rng = Application.InputBox("请选择单元格区域", "提取单元格的中文", , , , , , 8)
For Each a In rng
MyStr = a.Value
ResultStr = ""
With CreateObject("VBSCRIPT.REGEXP")
.Pattern = "\d{11}"
.IgnoreCase = True
.Global = True
If .test(MyStr) Then
For Each Item In .Execute(MyStr)
ResultStr = ResultStr & Item
Next Item
a.Offset(0, 1) = ResultStr
End If
End With
Next a
End Sub
Sub tel2()
Dim rng As Range, a As Range
Set rng = Application.InputBox("请选择单元格区域", "提取单元格的中文", , , , , , 8)
For Each a In rng
MyStr = a.Value
ResultStr = ""
With CreateObject("VBSCRIPT.REGEXP")
.Pattern = "\d{3}-\d{8}|\d{4}-\{7,8}"
.IgnoreCase = True
.Global = True
If .test(MyStr) Then
For Each Item In .Execute(MyStr)
ResultStr = ResultStr & Item
Next Item
a.Offset(0, 1) = ResultStr
End If
End With
Next a
End Sub
注意,我们这里是将两段代码合起来一直展示了,大家在实际使用中要注意区分,不要笼统的直接两段代码都拿过来当成一个功能使用了。
来看下代码的效果
代码解析
今天我们来比较简单的分享一些正则表达式的使用 开头我们也是分析了方法 手机号码总共有11位,那么我们需要将11位数字的号码提取出来,正则表达式呢,就分为两个部分
1. 11位
2. 数字
11位呢,在正则中是这样表示的,{11},{ }内部的数字代表的就是 数字的位数,如果想要表达一个区间呢?{11.15}11位到15位就是这样表示的 数字呢,前面已经学习了,\d代表的就是数字
组合起来\d{11}这就是手机号码的正则表达式了
下面再来看固话,固话我们也了解了结构,区号+号码
区号有3~4这两种,并且还是数字,那么我们就可以写成\d{3}和\d{4}
号码是7位和8位两种,3位区号对应8位号码,4位区号对应7~8位的号码\d{8}和\d{7,8}
合起来呢
\d{3}-\d{8}|\d{4}-\{7,8}
细心的小伙伴们会发现中间多了一个“|”,是什么意思呢?
转换成为汉语就是或者,“|”就是或者的意思
整个代码合起来就是寻找单元格中,3个数字+8个数字或者4个数字+7~8位的数字组成的一个组合
今天文字讲解比较多,不知道小伙伴们理解了吗?