分享

Excel VBA 8.22 完善提取数字代码,正则是关键

 群先 2021-02-11

前景提要

昨天我们学习了如何通过正则的方式来提取单元格中的数字,这里的数字是纯数字,并没有其他的中文,或者英文,不过有小伙伴说这样的场景太简单,实际的工作中,提取场景会更加的复杂,提取的结果也是要求更加的高,那么今天我们就针对大家提出的新的场景,进一步完善下代码吧

场景说明

Excel VBA 8.22 完善提取数字代码,正则是关键

还是和之前的场景差不多的样子,这里注意我们的标红处,就是今天新增加的数据部分,按照昨天的代码,我们确实是可以将数据提出出来

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

提取的方式,我们依然是选择通过正则来提取

看看最终的效果

Excel VBA 8.22 完善提取数字代码,正则是关键

我们这里将两个宏代码分别进行操作,大家可以对比着看看最终的结果,我们今天的代码不仅仅成功地提取出了数据,同时也是用“-”将不同位置的数据进行了区分,体现的效果会更加的好。后面大家直接用分列就可以实现更加完美的数据了,也可以在代码中直接操作分列。

代码解析

相较于上节的代码,这次的代码似乎和上节的代码一样,但是结果为什么不一样呢?

我们来看看代码

  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位就不行了。这主要是根据不同的使用场景来变化的。

Excel VBA 8.22 完善提取数字代码,正则是关键

这里我们一第二行的内容为例,来看看实际执行的过程

现在已经得到了内容,开始循环了。

Excel VBA 8.22 完善提取数字代码,正则是关键

首先第一次循环,就得到了13

Excel VBA 8.22 完善提取数字代码,正则是关键

第二次就得到了12

中间通过“-”连接,如果我们将这个{}内的数组更改为3呢?

Excel VBA 8.22 完善提取数字代码,正则是关键

可以看到,当代码再次针对第二行内容进行拆分的时候,直接一闪而过

为什么?

因为第二行的数字都是2位数的,没有三位数的

然后我们针对第五行进行操作

提取出了222222这个数字,但是并没有17这个最前面的数字,因为17是2位数,而2222222已经大于3位了,所以只能提取到222222

好了

今天的代码并不难,主要还是针对代码中正则表达式的写法的讲解

正则的具体的操作,我们会在后面单独开一个篇章来讲解,大家不要着急。先了解这些知识,后面就会容易很多


本节课的案例源码已经上传,需要的小伙伴请按照如下步骤操作,一个不能少哦~~

1.转发下本文章(算是对我的小小支持吧~)

2.点我头像加个关注~

3.后台私信“8-22-2”

希望大家多支持~~,多多关注 ~ ~

好了,明晚20:00,准时再见!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多