前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA:正则表达式(2) -批量修改内容

VBA:正则表达式(2) -批量修改内容

作者头像
Exploring
发布2023-09-11 11:32:40
5500
发布2023-09-11 11:32:40
举报
文章被收录于专栏:数据处理与编程实践

文章背景: 工作中,有时需要批量更新单元格内的信息。可以通过正则表达式匹配对应信息,然后再更新成自己想要的内容。

示例:原始数据保存在B列,需要在每个单元格引用的前面添加A列指定的工作表名称+!,结果如C列所示。对于B8中的公式,由于I49已经指定了工作表,所以此单元格引用不需要再处理,核心问题是如何定位单元格引用。

采用的VBA代码如下:

代码语言:javascript
复制
Option Explicit
Option Base 1

Sub RegExpDemoReplace()

    Dim objRegEx As Object      '用于创建正则对象
    
    Dim objMH As Object         '储存Matchs集合
    
    Dim i As Integer, j As Integer, form As String, newform As String, pre As String, ref As String
    
    Set objRegEx = CreateObject("vbscript.regexp")
    
    objRegEx.Pattern = "[^!]([A-Z]{1,3}\d{1,7})"
    
    objRegEx.Global = True      '全局匹配
    
    For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row
    
        form = " " & Cells(i, "B")  '添加一个空格,确保第一个单元格引用可以被正则表达式匹配到。
        
        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, "C") = Trim(newform)   '去除前导空格
            
        End If
        
    Next
    
    Set objRegEx = Nothing
    
    Set objMH = Nothing
    
End Sub

运行效果:

延伸阅读:

(1)SubMatches属性

在VBA的正则表达式中,SubMatches属性用于访问正则表达式匹配的子匹配项(也称为捕获组)。捕获组是正则表达式中用括号包围的部分,通常用于提取模式中的特定子字符串。SubMatches属性返回一个字符串数组,其中包含每个捕获组的值。

以下是一个示例,演示如何在VBA中使用SubMatches属性来访问正则表达式匹配的捕获组:

代码语言:javascript
复制
Option Explicit
Option Base 1

Sub TestSubMatches()

    Dim regex As Object
    Dim matches As Object
    Dim match As Object
    
    Dim inputString As String
    
    ' 创建正则表达式对象
    Set regex = CreateObject("VBScript.RegExp")
    
    regex.Global = True ' 启用全局匹配模式
    
    ' 设置正则表达式模式,包含两个捕获组
    regex.Pattern = "(\d+)\s+([a-zA-Z]+)" ' 匹配数字、空格、后跟字母
    
    ' 要在其中查找匹配的文本的输入字符串
    inputString = "There are 123 apples and 456 oranges."
    
    ' 查找所有匹配的内容
    Set matches = regex.Execute(inputString)
    
    ' 遍历匹配项并处理捕获组
    For Each match In matches
    
        ' 输出整个匹配项
        Debug.Print "整个匹配项: " & match.Value
        
        ' 输出第一个捕获组
        Debug.Print "捕获组1: " & match.SubMatches(0)
        
        ' 输出第二个捕获组
        Debug.Print "捕获组2: " & match.SubMatches(1)
        
    Next match
    
End Sub

运行结果:

代码语言:javascript
复制
整个匹配项: 123 apples
捕获组1: 123
捕获组2: apples
整个匹配项: 456 oranges
捕获组1: 456
捕获组2: oranges
  • \s匹配空格;
  • +匹配一次或多次前面的分组。

参考资料:

[1] VBA之正则表达式(2)-- 批量修改公式(https://blog.csdn.net/taller_2000/article/details/88097358

[2] Open AI解答

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据处理与编程实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档