VBA之正则表达式(7)

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

示例代码如下。

Sub RegExpReOrg()
    Dim strTxt As String, strKey As String
    Dim objRegEx As Object, objMatch As Object
    Dim objMH As Object, c As Range, rngData As Range
    Dim dic As Object, k
    Set objRegEx = CreateObject("vbscript.regexp")
    Set dic = CreateObject("scripting.dictionary")
    objRegEx.Pattern = "(\(\d+\))(【.+?】)(.*?),"
    objRegEx.Global = True
    Set rngData = Range([A2], Cells(Rows.Count, "A").End(xlUp))
    rngData.Offset(0, 1).ClearContents
    For Each c In rngData
        strTxt = Application.Clean(c.Value) & ","
        Set objMatch = objRegEx.Execute(strTxt)
        If objMatch.Count > 0 Then
            dic.RemoveAll
            For Each objMH In objMatch
                strKey = objMH.submatches(1)
                If dic.exists(strKey) Then
                    dic(strKey) = dic(strKey) & "," & objMH.submatches(2) & objMH.submatches(0)
                Else
                    dic(strKey) = objMH.submatches(2) & objMH.submatches(0)
                End If
            Next
            strTxt = ""
            For Each k In dic.Keys
                strTxt = strTxt & Chr(10) & k & dic(k)
            Next
            c.Offset(0, 1) = Mid(strTxt, 2)
        End If
    Next
    Set objMH = Nothing
    Set objMatch = Nothing
    Set objRegEx = Nothing
End Sub

【代码解析】
第6行代码使用后期绑定创建字典对象。
第7行代码使用后期绑定创建正则对象。
第8行代码指定正则匹配字符串。

匹配模式 含义 submatches序号
(\(\d+\)) 匹配圆括号包裹的至少1位数字,此处圆括号需要使用反斜杠进行转义 0
(【.+?】) 匹配全角方括号及其之中的内容,作为字典对象的Key 1
(.*?) 匹配“】”之后的字符,使用非贪婪匹配 2
匹配每组数据末尾的全角逗号 -

第9行代码指定数据区域。
第10行代码清空B列单元格。
第12行代码第31行代码循环处理工作表A列中的数据。
第13行代码读取单元格内容并在末尾添加一个全角逗号,便于正则匹配
第14行代码执行正则匹配。
如果匹配成功,那么第17行到第24行代码使用For循环结构整理数据。
第16行代码清空字典。
第18行代码获取字典的键值。
第19行到第23行代码如果字典中存在相同键值,就将相应的字符组合后保存在字典中,如果不存在,则添加键值对。
第26行到第28行代码按照多行格式整理数据。
第29行代码将数据写入B列单元格。

(0)

相关推荐

  • 如何用VBA代码查询两列数据差异?

    照例打个响指,举个栗子. 如上图所示,查询A列和C列的数据,提取出相同值.A列存在C列不存在的值.A列不存在C列存在的值-- 查询结果如下图所示. 当然,这事儿并不是一定得用VBA,函数和Power ...

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

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

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

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

  • vba中正则表达式

    vba中正则表达式

  • VBA之正则表达式(2)

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

  •  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之正则表达式(8)

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

  •  VBA之正则表达式(9)

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

  •  VBA之正则表达式(10)

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