VBA之正则表达式(2)-- 批量修改公式

本文介绍如何使用VBA和正则表达式处理Excel单元格引用,通过在引用前添加工作表名称,实现公式或数据的跨工作表引用。详细解析了正则表达式的匹配模式及VBA代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实例需求:数据保存在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代码都很简单。


相关博文链接:
VBA之正则表达式(1)-- 基础篇
VBA之正则表达式(2)-- 批量修改公式
VBA之正则表达式(3)-- 特殊公式计算
VBA之正则表达式(4)-- 提取日期和金额
VBA之正则表达式(5)-- 中文字符
VBA之正则表达式(6)-- 设置音标格式
VBA之正则表达式(7)-- 乾坤大挪移(数据整理)
VBA之正则表达式(8)-- 重复字符分组
VBA之正则表达式(9)-- 添加千分位(1/3)
VBA之正则表达式(10)-- 添加千分位(2/3)
VBA之正则表达式(11)-- 添加千分位(3/3)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值