Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2727|回复: 8

[已解决]正则表达式解释?

[复制链接]
发表于 2014-4-8 20:12 | 显示全部楼层 |阅读模式
本帖最后由 hahada 于 2014-4-8 22:58 编辑

Sub test()
    Dim reg, n, st1, st2, arr, i&
    n = Range("e65536").End(3).Row
    If n < 5 Then Exit Sub
    n = n + 3 - Val(Right(Range("e" & n), 1))
    arr = Range("e5:e" & n)
    Set reg = CreateObject("vbscript.regexp")
    With reg
        .Global = True
        .Pattern = "\d+($|\n)"
        For i = 1 To UBound(arr)
            If arr(i, 1) <> "" Then
            st1 = .Replace(arr(i, 1), "")     替换为空是什么意思
                st2 = .Execute(arr(i, 1))(0)  Execute是什么意思
                n = Val(st2)
            Else
                n = n + 1
                arr(i, 1) = st1 & Format(n, WorksheetFunction.Rept("0", Len(st2)))
            End If
        Next
    End With
    [e5].Resize(UBound(arr)) = arr
End Sub
最佳答案
2014-4-8 22:15
st1 = .Replace(arr(i, 1), "")    比如:arr(i,1)的值为:”今天下午收入12456“   在这个字符串中,符合pattern模式的匹配为: "12456” 把它替换为"",得到新的字符串:“今天下午收入"。

如果arr(i,1)的值为:“今天下午收入12456(换行符)
                             昨天下午收入11425(换行符)
                             前天下午收入147898(结尾)"
st1 = .Replace(arr(i, 1), "")    这时候所有符合pattern的模式都将替换为空,得到“今天下午收入昨天下午收入前天下午收入"
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-4-8 21:11 | 显示全部楼层
本帖最后由 810126769 于 2014-4-8 21:17 编辑

   If arr(i, 1) <> "" Then
            st1 = .Replace(arr(i, 1), "")        '把符合patten模式的匹配替换为空。也就是从原字符串中删除匹配值。
                st2 = .Execute(arr(i, 1))(0)   ' Execute是开始执行正则搜索,并把第一个符合patten模式的匹配赋值给变量 st2
                n = Val(st2)
            Else
                n = n + 1
                arr(i, 1) = st1 & Format(n, WorksheetFunction.Rept("0", Len(st2)))     '去除patten模式匹配的字符串后剩下的字符串,再连接上若干位的一个数字,数字的位数与第一个符合patten模式匹配的字符串的字符数相等。即st2这个字符的字符数有几个,就连接一个几位数。如果位数不够,就是前面加一些0。比如:当st1="太阳",n=5,而st2是4个字符,那么,就用st1连接一个0005,即arr(i,1)的值为:太阳0005

评分

参与人数 1 +1 收起 理由
hahada + 1 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-4-8 21:18 | 显示全部楼层
810126769 发表于 2014-4-8 21:11
If arr(i, 1)  "" Then
            st1 = .Replace(arr(i, 1), "")        '把符合patten模式的匹配替 ...

能不能把代码都解释下?
回复

使用道具 举报

 楼主| 发表于 2014-4-8 21:25 | 显示全部楼层
810126769 发表于 2014-4-8 21:11
If arr(i, 1)  "" Then
            st1 = .Replace(arr(i, 1), "")        '把符合patten模式的匹配替 ...

这代码能不能都解释下,谢谢
回复

使用道具 举报

 楼主| 发表于 2014-4-8 21:29 | 显示全部楼层
810126769 发表于 2014-4-8 21:11
If arr(i, 1)  "" Then
            st1 = .Replace(arr(i, 1), "")        '把符合patten模式的匹配替 ...

辛苦下,肯定评个最佳
回复

使用道具 举报

发表于 2014-4-8 21:48 | 显示全部楼层
hahada 发表于 2014-4-8 21:18
能不能把代码都解释下?

Sub test()
    Dim reg, n, st1, st2, arr, i&    '定义变量
    n = Range("e65536").End(3).Row    ’计算E列最后一行有数据的单元格的行号。
    If n < 5 Then Exit Sub       '如果E列最后一个单元格的行号小于5,那么退出本程序。如果大于等于5才执行下面的代码。
    n = n + 3 - Val(Right(Range("e" & n), 1))    '给n重新赋值:e列最后一行的行号+3再减去E列最后一个单元格的数据末尾的那个数字。
    arr = Range("e5:e" & n)    '  把E5到E列第N个单元格装入数组arr。比如:如果e列最后一个有数据的行在第20 行。而E20这个单元格的数据为3212,那么n=20+3-2=21,就把E10到e21这个区域装入数组arr。
    Set reg = CreateObject("vbscript.regexp")       ’创建正则表达式对象
    With reg
        .Global = True                  ' 设置正则表达式为全局搜索(即找出字符串中所有符合pattern模式的字符串)
        .Pattern = "\d+($|\n)"     '设置正则表达式的搜索模式为:至少一个数字到任意多个数字连接一个换行符(即一串数字后面加了回车符,或者其它换行符)。或者至少一个数字到任意多个数字连接一个输入结尾(即一串数字就完了,再也没有其它内容)。
        For i = 1 To UBound(arr)     ’开始从一到arr的最后一个值进行循环。
            If arr(i, 1) <> "" Then     '如果arr中第i行第1列的值不为空,就执行下面的代码。
            st1 = .Replace(arr(i, 1), "")     '把arr第i行第一列中的一串数字加换行符(或者以arr第i行第一列中的字符串中最末尾的一串数字)替换为空。
                st2 = .Execute(arr(i, 1))(0)  '提取符合一串数字连接一个换行符(或者最后的一串数字)这样的第一个字符串交给变量st2。
                n = Val(st2)      ’把提取出的这一串字符型的数字转换为数字型以后交给变量n.
            Else
                n = n + 1       '给n重新赋值,让n的值再加上1交给变量n
                arr(i, 1) = st1 & Format(n, WorksheetFunction.Rept("0", Len(st2)))    ’format就是以提取的这串字符串的数字的个数作为格式,把n的值格式化为st2的字符个数的一个字符串。如果位数不够就在数字前加0补位。用这样新连接后的值替换掉原来arr(i,1)的值。
            End If
        Next
    End With
    [e5].Resize(UBound(arr)) = arr    '把arr中新得到的元素输出到以单元格e5为顶点,arr中元素个数为行数,一列为宽度的单元格区域。
End Sub

评分

参与人数 1 +1 收起 理由
hahada + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2014-4-8 22:15 | 显示全部楼层    本楼为最佳答案   
st1 = .Replace(arr(i, 1), "")    比如:arr(i,1)的值为:”今天下午收入12456“   在这个字符串中,符合pattern模式的匹配为: "12456” 把它替换为"",得到新的字符串:“今天下午收入"。

如果arr(i,1)的值为:“今天下午收入12456(换行符)
                             昨天下午收入11425(换行符)
                             前天下午收入147898(结尾)"
st1 = .Replace(arr(i, 1), "")    这时候所有符合pattern的模式都将替换为空,得到“今天下午收入昨天下午收入前天下午收入"

评分

参与人数 1 +1 收起 理由
hahada + 1 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-4-8 23:02 | 显示全部楼层
810126769 发表于 2014-4-8 22:15
st1 = .Replace(arr(i, 1), "")    比如:arr(i,1)的值为:”今天下午收入12456“   在这个字符串中,符合 ...

n = n + 3 - Val(Right(Range("e" & n), 1))
加个Val是什么意思?
回复

使用道具 举报

发表于 2014-4-9 06:28 | 显示全部楼层
hahada 发表于 2014-4-8 23:02
n = n + 3 - Val(Right(Range("e" & n), 1))
加个Val是什么意思?

Val(Right(Range("e" & n), 1))    right()取出的数字是文本型的数字,加个VAL()函数可以将文本型数字转换为数字型数字
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-23 15:34 , Processed in 0.420047 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表