VBA之正则表达式(41)-- 快速标记两个星号之后的字符

79 篇文章 6 订阅
49 篇文章 18 订阅
文章介绍了如何使用VBA结合正则表达式,处理Excel工作表数据,特别是查找D列中包含超过两个星号的内容,并将第三个星号后的字符设为红色。提供了两种不同的子程序Demo1和Demo2,分别展示了不同的实现方法。
摘要由CSDN通过智能技术生成

实例需求:工作表中的数据保存在A列~G列,现需要识别D列中包含超过两个星号的内容,并将第3个星号及其之后的字符设置为红色字体,如图所示。

在这里插入图片描述

示例代码如下。

Sub Demo1()
    Dim objRegExp As Object
    Dim objMatch As Object
    Dim strMatch As String
    Dim iLoc As Integer, strTxt As String
    arrData = [a1].CurrentRegion
    ActiveSheet.Columns(4).Font.Color = vbNone
    Set objRegExp = CreateObject("vbScript.Regexp")
    With objRegExp
        .Global = True
        .Pattern = "^\*[一-龟]+\*[一-龟]+(.*)$"
        For i = 2 To UBound(arrData)
            strTxt = arrData(i, 4)
            Set objMatch = .Execute(strTxt)
            If objMatch.Count > 0 Then
                strMatch = objMatch(0).submatches(0)
                If Len(strMatch) > 0 Then
                    iLoc = VBA.InStrRev(strTxt, strMatch)
                    Cells(i, 4).Characters(iLoc, Len(strTxt) - iLoc + 1).Font.Color = vbRed
                End If
            End If
        Next i
    End With
    Set objRegExp = Nothing
    Set objMatch = Nothing
End Sub

【代码解析】
第6行代码将A1单元格所在的数据区域加载到数组中。
第7行代码将D列单元格字体颜色设置为“自动”。
第8行代码创建正则对象。
第10行代码设置正则全局匹配。
第11行代码设置正则匹配规则。

正则表达式说明
^匹配开始位置
\*[一-龟]+匹配一个星号加多个中文字符
$匹配最后位置

第12~22行代码循环处理每行数据。
第13行代码读取D列单元格内容。
第14行代码执行正则匹配。
第15行代码判断是否匹配成功。
第16行代码读取匹配组内容。
第17行代码匹配组内容是否为空。
第18行代码在单元格内容中查找匹配组的字符位置。
注意此处必须使用InStrRev,而不能使用如下代码,如果单元格内容中有重复字符,下述方法定位的位置将出现错误,例如:*万事如意*身体健康*万事如意
iLoc = VBA.InStr(1, strTxt, strMatch)
第19行代码设置相应字符的字体颜色为红色。
第24~25行代码释放对象变量占用的系统资源。


不使用VBA字符查找,也可以可以完美实现这个问题。

Sub Demo2()
    Dim objRegExp As Object
    Dim objMatch As Object
    Dim strMatch As String
    Dim iLoc As Integer, strTxt As String
    arrData = [a1].CurrentRegion
    ActiveSheet.Columns(4).Font.Color = vbNone
    Set objRegExp = CreateObject("vbScript.Regexp")
    With objRegExp
        .Global = True
        .Pattern = "\*[一-龟]+"
        For i = 2 To UBound(arrData)
            strTxt = arrData(i, 4)
            Set objMatch = objRegExp.Execute(strTxt)
            If objMatch.Count > 2 Then
                iLoc = objMatch(2).firstindex + 1
                Cells(i, 4).Characters(iLoc, Len(strTxt) - iLoc + 1).Font.Color = vbRed
            End If
        Next i
    End With
    Set objRegExp = Nothing
    Set objMatch = Nothing
End Sub

【代码解析】
第15行代码判断匹配成功的数量是否超过两个。
第16行代码代码使用第3个匹配组(objMatch(2))的firstindex属性获取字符起始位置,由于正则对象中编号都是0开始的,所以需要加1才能应用于第17行代码中。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值