数据转换之连续数据合并

文摘   教育   2024-09-13 19:50   广东  
今天我们来看一个题目,如图所示,需要将A列数据转换为B列形式,也就是连续数据使用~连接,不连续的使用逗号分隔。

今天我们就用正则来处理这个题吧

Sub test()Dim arr, Reg As Object, brr, mat As Objectarr = Range("A1").CurrentRegion.ValueSet Reg = CreateObject("vbscript.regexp")With Reg    .Pattern = "([a-zA-Z]+)(\d+)"    .Global = True    For i = 2 To UBound(arr)            Set mat = .Execute(arr(i, 1))            j = 0            For Each M In mat                If j <> mat.Count - 1 Then   '位置判断                    Key = mat(j).submatches(1) * 1 <> mat(j + 1).submatches(1) - 1                Else                    Key = mat(j - 1).submatches(1) * 1 <> mat(j).submatches(1) - 1                End If                If j = 0 Then         '第一个数据处理                    If Key Then k = 0 Else k = 1                    arr(i, 2) = mat(j)                ElseIf j <> mat.Count - 1 Then   '中间数据处理                    If k = 1 Then                        If Key Then                            arr(i, 2) = arr(i, 2) & "~" & mat(j)                            k = 0                        End If                    Else                        arr(i, 2) = arr(i, 2) & "," & mat(j)                        k = 1                    End If                Else        '最后一个数据处理                    If Key Then arr(i, 2) = arr(i, 2) & "," & mat(j) Else arr(i, 2) = arr(i, 2) & "~" & mat(j)                End If                 j = j + 1            Next    Next iEnd WithRange("A1").CurrentRegion.Value = arrEnd Sub
第4行:创建正则
第6行:设置匹配模式,匹配字母和数字
第8行:循环数据区域
第9行:执行正则匹配,并赋值给mat
第10行:赋值j为0,该变量用于判断正则匹配的结果的位置
第11行:遍历执行后的结果
第12-16行:如果不是匹配最后一个位置的数据,则令key=匹配的当前的数字与下一个数据比较,否则就与前一个数据比较
第17-19行:如果是第一个数据,则将该数据直接赋值给数据源第二列,变量k用于判断是否是连续的结尾或者开头
第20-29行:对于排列在中间的匹配结果,如果k=1,代表数据不是开头,如果key=1,则代表是结尾,则用~连接,如果k=0,则代表数据为开头,则连接一个逗号后,连接新数据
第30-31行:对于最后一个数据的处理
第33行:循环后,数据位置标记自加一
下面来看看效果:

好了,本期教程就到这里啦,走过路过的点个关注分享一下吧,谢谢啦

求关注-求星标-求点赞-求看-求分享
最近创建了一个VBA学习交流群,如有需要进群可以添加微信 jaresfzz

Excel应用教程
主要提供Excel vba,函数,图表,数据透视表,pq,Js等教程
 最新文章