Excel VBA 8.22 完善提取数字代码,正则是关键
前景提要
昨天我们学习了如何通过正则的方式来提取单元格中的数字,这里的数字是纯数字,并没有其他的中文,或者英文,不过有小伙伴说这样的场景太简单,实际的工作中,提取场景会更加的复杂,提取的结果也是要求更加的高,那么今天我们就针对大家提出的新的场景,进一步完善下代码吧
场景说明
还是和之前的场景差不多的样子,这里注意我们的标红处,就是今天新增加的数据部分,按照昨天的代码,我们确实是可以将数据提出出来
但是我们会发现,提取的结果差强人意,虽然是将数字提取出来了,但是并没有任何的区分,导致所有的数据都粘在一起,这对于我们拆分提取数据并没有太大的意思,这样强行将两个不同意义的数据合并在一起的提取,感觉是缺少了灵魂,所以今天我们要改动下代码,将提取的数据也分割出来
代码区
Sub sz2()Dim rng As Range, a As RangeSet rng = Application.InputBox('请选择单元格区域', '提取单元格的数字', , , , , , 8)For Each a In rng MyStr = a.Value ResultStr = '' With CreateObject('VBSCRIPT.REGEXP') .Pattern = '\d{2,}' .IgnoreCase = True .Global = True If .test(MyStr) Then For Each Item In .Execute(MyStr) ResultStr = ResultStr & '-' & Item Next Item ResultStr = Right(ResultStr, Len(ResultStr) - 1) a.Offset(0, 1) = ResultStr End If End WithNext aEnd Sub
提取的方式,我们依然是选择通过正则来提取
看看最终的效果
我们这里将两个宏代码分别进行操作,大家可以对比着看看最终的结果,我们今天的代码不仅仅成功地提取出了数据,同时也是用“-”将不同位置的数据进行了区分,体现的效果会更加的好。后面大家直接用分列就可以实现更加完美的数据了,也可以在代码中直接操作分列。
代码解析
相较于上节的代码,这次的代码似乎和上节的代码一样,但是结果为什么不一样呢?
我们来看看代码
With CreateObject('VBSCRIPT.REGEXP') .Pattern = '\d{2,}' .IgnoreCase = True .Global = True If .test(MyStr) Then For Each Item In .Execute(MyStr) ResultStr = ResultStr & '-' & Item Next Item ResultStr = Right(ResultStr, Len(ResultStr) - 1) a.Offset(0, 1) = ResultStr End If End With
唯一的不同之处就是我们的正则表达式有所变化,看看第二行的代码
.Pattern = '\d{2,}'
\d在正则中代表的就是数据,我们既然是要匹配数字,所以这里就需要使用\d
{2,}代表的匹配的数字至少有2位,就是2位数,当然也可以是3位,甚至更多位,但是至少是2位,1位就不行了。这主要是根据不同的使用场景来变化的。
这里我们一第二行的内容为例,来看看实际执行的过程
现在已经得到了内容,开始循环了。
首先第一次循环,就得到了13
第二次就得到了12
中间通过“-”连接,如果我们将这个{}内的数组更改为3呢?
可以看到,当代码再次针对第二行内容进行拆分的时候,直接一闪而过
为什么?
因为第二行的数字都是2位数的,没有三位数的
然后我们针对第五行进行操作
提取出了222222这个数字,但是并没有17这个最前面的数字,因为17是2位数,而2222222已经大于3位了,所以只能提取到222222
好了
今天的代码并不难,主要还是针对代码中正则表达式的写法的讲解
正则的具体的操作,我们会在后面单独开一个篇章来讲解,大家不要着急。先了解这些知识,后面就会容易很多
本节课的案例源码已经上传,需要的小伙伴请按照如下步骤操作,一个不能少哦~~
1.转发下本文章(算是对我的小小支持吧~)
2.点我头像加个关注~
3.后台私信“8-22-2”
希望大家多支持~~,多多关注 ~ ~
好了,明晚20:00,准时再见!