VBA之正则表达式(4)-- 提取日期和金额

论坛 期权论坛 期权     
VBA编程学习与实践   2019-7-20 20:19   7645   0
实例需求:数据保存在A列中,需要将其中的日期和金额分别提取至B列和C列。其中日期也两种不同格式,金额可能包含小数点、千分符和货币标识。




示例代码如下:
  1. Sub RegExp_Date_Num()
复制代码
  1.     Dim Res()
复制代码
  1.     Dim objRegEx As Object
复制代码
  1.     Dim objMH As Object
复制代码
  1.     Dim j As Integer
复制代码
  1.     Set objRegEx = CreateObject("vbscript.regexp")
复制代码
  1.     objRegEx.Pattern = "(\d{4}-\d{2}-\d{2}|\d{4}.\d{2}.\d{2}).*?(([A-Z]{3})*\d+[\d.,]*元)"
复制代码
  1.     objRegEx.Global = True
复制代码
  1.     For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
复制代码
  1.         form = Cells(i, "A")
复制代码
  1.         Set objMH = objRegEx.Execute(form)
复制代码
  1.         If objMH.Count > 0 Then
复制代码
  1.             Cells(i, 2) = CStr(objMH(0).submatches(0))
复制代码
  1.             Cells(i, 3) = CStr(objMH(0).submatches(1))
复制代码
  1.         End If
复制代码
  1.     Next
复制代码
  1.     Set objRegEx = Nothing
复制代码
  1.     Set objMH = Nothing
复制代码
  1. End Sub
复制代码
【代码解析】
第6行代码使用后期绑定创建正则对象。
第7行代码指定正则匹配字符串,

如果直接使用[\d.,]+匹配金额中的数字,则会匹配到单个小数点或者逗号,例如数据为:旧的一年结束,元旦将要来临,此模式可以将匹配到,元。由此可见组织一个严谨的正则表达式需要考虑很多情况。
第8行代码设置为全局搜索模式。
第9行代码第16行代码循环处理工作表中的数据。
第11行代码执行正则匹配,返回结果为MatchCollection集合对象。
第13行和第14行代码分别将日期和金额写入工作表中
作者:taller
微软全球最有价值专家
ExcelHome技术论坛VBA版块版主
EH论坛VBA系列图书主创人

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:220
帖子:44
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP