学个正则:批量修改公式

如下图所示,数据保存在F列,需要在每个单元格引用之前添加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,6})'    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 = NothingEnd Sub

【代码解析】

第6行代码使用后期绑定创建正则对象。

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

第8行代码设置为全局搜索模式。

第9行代码第21行代码循环处理工作表中的数据。

第10行代码在数据前添加一个空格,确保第一个单元格引用可以被正则匹配成功。

第11行代码将添加的工作表名字符串保存在变量中。

第12行代码执行正则匹配,返回结果为MatchCollection集合对象。

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

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

如果匹配成功,第15行到第18行代码循环遍历MatchCollection对象获取结果。

第16行代码读取submatches的匹配字符串。

第17行代码将匹配字符串替换为添加工作表名称的字符串。

第19行代码去除前导空格后将结果写入I列单元格。

运行代码截图如下所示。

(0)

相关推荐