VBA之正则表达式(2)

实例需求:数据保存在F列(公式,判断条件,whatever),需要在每个单元格引用之前添加A列指定的工作表名称+!,结果如H列所示,对于F16中的公式,由于I49已经指定工作表,所以此单元格不需要再处理,核心问题是如何定位单元格引用。

示例代码如下。

Sub RegExpDemoReplace()
    Dim Res()
    Dim objRegEx As Object
    Dim objMH As Object
    Dim j As Integer
    Set objRegEx = CreateObject("vbscript.regexp")
    objRegEx.Pattern = "[^!]([A-Z]{1,3}\d{1,7})"
    objRegEx.Global = True
    For i = 1 To Cells(Rows.Count, "F").End(xlUp).Row
        form = " " & Cells(i, "F")
        pre = Cells(i, 1) & "!"
        Set objMH = objRegEx.Execute(form)
        If objMH.Count > 0 Then
            newform = form
            For j = 0 To objMH.Count - 1
                ref = objMH(j).submatches(0)
                newform = Replace(newform, ref, pre & ref)
            Next
            Cells(i, "I") = Trim(newform)
        End If
    Next
    Set objRegEx = Nothing
    Set objMH = Nothing
End Sub

【代码解析】
第6行代码使用后期绑定创建正则对象。
第7行代码指定正则匹配字符串,这是应用正则表达式的核心。本文仅对匹配模式进行简单讲解,如果需要系统的学习正则,可以自行搜索相关学习材料。

匹配模式 含义
[^!] 匹配除了叹号之外的一个字符,用于剔除已经指定工作表的单元格引用
[A-Z]{1,3} 1个至3个大小字母,匹配列标A到XFD,这里不是严格的匹配,例如ZZZ也可以被匹配,但是这不是合法的单元格引用
\d{1,6} 1位至6位数字,匹配行号,同上也不是严格的匹配
([A-Z]{1,3}\d{1,7}) 圆括号代表提取匹配的字符组,也就是单元格引用

第8行代码设置为全局搜索模式。
第9行代码第21行代码循环处理工作表中的数据。
第10行代码在数据前添加一个空格,确保第一个单元格引用可以被正则匹配成功。
第11行代码将添加的工作表名字符串保存在变量中。
第12行代码执行正则匹配,返回结果为MatchCollection集合对象。


MatchCollection集合对象有两个只读属性。

属性 含义
Count 成功匹配的对象(字符组)数目
Item 集合的通用方法,需要传入Index值获取指定的元素

MatchCollection集合包含Match对象,Match对象具有如下三个只读属性。

属性 含义
FirstIndex 匹配字符串在原字符串中的起始位置,其值从0开始
Length 匹配字符串的长度
Value 成功匹配的字符串内容

Match对象还包含SubMatches集合对象,其中为匹配字符串中每个分组的值,Match对象也具有Count和Item两个属性,其含义与MatchCollection集合对象类似。


如果匹配成功,第15行到第18行代码循环遍历MatchCollection对象获取结果。
第16行代码读取submatches的匹配字符串。
第17行代码将匹配字符串替换为添加工作表名称的字符串。
第19行代码去除前导空格后将结果写入I列单元格。

运行代码截图如下所示。

只要成功构建了正则匹配模式,其它部分的VBA代码都很简单。


(0)

相关推荐

  • Excel乱序中提取信息的简便招法

    日常办公中,常会遇到这样一个难题:如何在惨不忍赌的数据中快速提取需要的字符串?如下图所示.要提取出第一列文本中转让的号码,QQ号,联系电话等.一般情况下大家是如何操作呢? 原图: 提取效果: 在Exc ...

  • 这个超牛逼的求和公式,请速收藏起来!

    与 30万 读者一起学Excel VIP学员的问题,要根据这杂乱无章的费用明细,计算合计金额. 这真是令人头疼的问题! 不幸中的大幸,这种居然可以解决.赶紧把下面的内容收藏起来,否则下回遇到猪队友,欲 ...

  • EXCEL VBA 使用正则表达式清洗替换数据

    在EXCEL表内遇到有规律性的数据需要提取或者替换时,比如在数据中提取时间,身份证号码等,EXCEL内自带的查找替换就难以实现,我们可以利用VBA适用正则表达式去对数据进行匹配. 什么是正则表达式? ...

  • vba中正则表达式

    vba中正则表达式

  •  VBA之正则表达式(3)

    实例需求:数据保存在B列,其格式为规格1*数量1 + 规格2*数量2 + ...,现在需要统计数量总和,如C列所示.例如B3中明细为100*3+115*1对应的包装个数就是3+1. 示例代码如下. S ...

  • VBA之正则表达式(5)

    实例需求:数据保存在A列中,需要将其中中文字符提取至B列.如何匹配中文字符呢? 大家都知道匹配英文单词很简单,[a-zA-z]把26个字母大小写将都涵盖了,可是中文字符怎么搞呢,是否也可以使用类似的方 ...

  •  VBA之正则表达式(6)

    实例需求:数据保存在A列中,需要对其中音标部分进行下划线标注,如C列所示,匹配这样的非典型字符,正则表达式是最佳选择. 示例代码如下. Sub RegExpDemo() Dim strTxt As S ...

  •  VBA之正则表达式(7)

    实例需求:数据保存在A列中,数据组之间使用全角逗号分隔,重整后需要将每组数据开始的圆括号部分移动到末尾,并合并相同的全角方括号内容.貌似这个需求有些拗口,实际效果见B列. 示例代码如下. Sub Re ...

  •  VBA之正则表达式(8)

    实例需求:数据保存在A列中,需要将其中重复字符分拆后保存在后续的列中,为简化示例代码,只考虑小写英文字符. 这个需求也并不复杂,用VBA代码逐个判断字符和其前后的字符对比,就可以区分每组,高手可以写出 ...

  •  VBA之正则表达式(9)

    在正则表达式中有如下几种环视(断言),很多正则的教学文章中都会讲解其含义,也有一些例子. 正则表达式 说明 (?<=Expression) 逆序肯定环视,表示所在位置左侧能够匹配Expressi ...

  •  VBA之正则表达式(10)

    <添加千分位(1/3)>博文讲到,简单合并正则表达式无法实现想要的效果,问题在于小数部分数字. 这里的核心是如何消耗掉小数部分的数字,不被捕获,可以实现添加千分位功能的正则表达式如下: ( ...