在VB6/VBA中使用正则表达式

一、关于起因

最近在Office的QQ群里问如何在一串字符串中提取数值并加总的问题。如果使用正则表达式可以非常迅速的解决这个问题。

那么今天我就探讨一下在VB6/VBA中使用正则表达式的方法及代码,另外为了快速测试正则表达式,我给大家推荐notepad++及使用方式。

二、操作步骤

1、按Alt+F11进入Excel的VBE环境,依次选择“工具/引用”菜单,选择“Microsoft VBScript Regular Express”;

2、插入一个模块,在模块中输入如下所示的代码;

 1 Function SumValueInText(TargetRange As Range) As Double
 2     Dim mRegExp As RegExp
 3     Dim mMatches As MatchCollection      ‘匹配字符串集合对象
 4     Dim mMatch As Match        ‘匹配字符串
 5
 6     Set mRegExp = New RegExp
 7     With mRegExp
 8         .Global = True                              ‘True表示匹配所有, False表示仅匹配第一个符合项
 9         .IgnoreCase = True                          ‘True表示不区分大小写, False表示区分大小写
10         .Pattern = "([0-9])?[.]([0-9])+|([0-9])+"   ‘匹配字符模式
11         Set mMatches = .Execute(TargetRange.Text)   ‘执行正则查找,返回所有匹配结果的集合,若未找到,则为空
12         For Each mMatch In mMatches
13             SumValueInText = SumValueInText + CDbl(mMatch.Value)
14         Next
15     End With
16
17     Set mRegExp = Nothing
18     Set mMatches = Nothing
19 End Function

3、在工作表的A列单元格中输入各种测试字符串,在B列单元格中输入自定义函数进行测试,结果如下图所示;

三、Attention

在VB6/VBA中使用正则表达式时,我们也可以省去第一步,即采用后期绑定的方式来使用正则表达式,但是代码要做相应的调整,如下所示为调整后的代码。

 1 Function SumValueInText(TargetRange As Range) As Double
 2     Dim mRegExp As Object       ‘正则表达式对象
 3     Dim mMatches As Object      ‘匹配字符串集合对象
 4     Dim mMatch As Object        ‘匹配字符串
 5
 6     Set mRegExp = CreateObject("Vbscript.Regexp")
 7     With mRegExp
 8         .Global = True                              ‘True表示匹配所有, False表示仅匹配第一个符合项
 9         .IgnoreCase = True                          ‘True表示不区分大小写, False表示区分大小写
10         .Pattern = "([0-9])?[.]([0-9])+|([0-9])+"   ‘匹配字符模式
11         Set mMatches = .Execute(TargetRange.Text)   ‘执行正则查找,返回所有匹配结果的集合,若未找到,则为空
12         For Each mMatch In mMatches
13             SumValueInText = SumValueInText + CDbl(mMatch.Value)
14         Next
15     End With
16
17     Set mRegExp = Nothing
18     Set mMatches = Nothing
19 End Function
时间: 2024-10-11 16:12:50

在VB6/VBA中使用正则表达式的相关文章

VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)

前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. VB中默认是没有鼠标移出事件响应的,而这个事件其实在项目开发中,实用性很强,很多时候需要在鼠标移出窗体或控件时做些事情:没有这个事件会感觉很费力: 今天我所说的实际案例就是,在窗体上,设计一个SplitterBar控件,窗体的最终用户使用这个控件可以在运行程序时任意调整其内部控件大小. 我在第二篇参考博文作者开发的

使用vba做一个正则表达式提取文本工具

测试中经常会遇到对数据的处理,比如我要删除某些特定数据,数据源是从网页请求中抓取,这时候可能复制下来一大堆内容,其中我们只需要特定的某些部分,笔者通常做法是拷贝到notepad++中处理,结合RegTester工具,但是RegTest需要导出匹配数据,不能直接拷贝,稍微麻烦了一点点......于是想用vba写一个正则表达式提取工具好了,又不花时间.(晕,刚想起来其实会有在线工具的,比如:http://tool.oschina.net/regex/),虽然找到了在线工具,还是说一下自己做的这个吧~

JavaScript中的正则表达式(终结篇)

JavaScript中的正则表达式(终结篇) 在之前的几篇文章中,我们了解了正则表达式的基本语法,但那些语法不是针对于某一个特定语言的.这篇博文我们将通过下面几个部分来了解正则表达式在JavaScript中的使用: JavaScript对正则表达式的支持程度 支持正则表达式的RegExp类型 RegExp的实例属性 RegExp的实例方法 RegExp的构造函数属性 简单的应用 第一部分:JavaScript对正则表达式的支持程度 之前我介绍了正则表达式的基本语法,如果大家不是很了解可以先看下面

Python中re(正则表达式)模块函数学习

今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. 方法/属性 作用 match() 决定 RE 是否在字符串刚开始的位置匹配 search() 扫描字符串,找到这个 RE 匹配的位置 findall() 找到 RE 匹配的所有子串,并把它们作为一个列表返回 finditer() 找到 RE 匹配的所有子串,并把它们作为一个迭代器返回 match() 函数只检查 RE 是否在字符串开始处匹配

Coursera-Getting and Cleaning Data-week4-R语言中的正则表达式以及文本处理

Coursera-Getting and Cleaning Data-Week4 Thursday, January 29, 2015 补上第四周笔记,以及本次课程总结. 第四周课程主要针对text进行处理.里面包括 1.变量名的处理 2.正则表达式 3.日期处理(参见swirl lubridate包练习) 首先,变量名的处理,奉行两个原则,1)统一大小写tolower/toupper:2)去掉在导入数据时,因为特殊字符导致的合并变量 3)不要重复:4)少用代码缩写 使用的函数包括 替换查找:

SQL Server中使用正则表达式

SQL Server 2005及以上版本支持用CLR语言(C# .NET.VB.NET)编写过程.触发器和函数,因此使得正则匹配,数据提取能够在SQL中灵活运用,大大提高了SQL处理字符串,文本等内容的灵活性及高效性. 操作步骤: 1.新建一个SQL Server项目(输入用户名,密码,选择DB),新建好后,可以在属性中更改的 2.新建一个类“RegexMatch.cs”,选择用户定义的函数 可以看到,该类为一个部分类:public partial class UserDefinedFuncti

String的replaceAll方法中的正则表达式用法

项目里面 需要对已手机号码进行 如下的显示 比如15088688388 要显示为150****8388的效果 实现这个简单的效果 方法有很多 我想试试用正则表达式去实现 查了点资料最终试出来以下方法可行 System.out.println("15088688388".replaceAll("(\\d{3})(\\d{4})","$1****")); 输出结果:150****8388 首先对replaceAll方法的第一个参数进行解释 第一个参数

MySQL中的正则表达式

正则表达式是用正则表达式语言来建立 基本字符的匹配 .是正则表达式语言中的一个特殊的字符,它表示匹配任意一个字符 在LIKE和REGEXP之间有一个重要的差别,LIKE匹配整个列,如果被匹配的文本仅在列值中出现,LIKE将不会找到它,相应的行也不会被返回(除非使用通配符) 而REGEXP在列值内匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行也会被返回. MySQL中的正则表达式匹配默认不区分大小写,为区分大小写,可使用BINARY关键字,在REGEXP后面加上BINARY即

VBA中使用类和事件的注册

想了解一下VBA中自定义类和事件,以及注册事件处理程序的方法. 折腾了大半天,觉得这样的方式实在称不上“注册”,所以加一个“伪”字.纯粹是瞎试,原理也还没有摸透.先留着,有时间再接着摸. 做以下尝试: 1.建一个自定义类(类模块),类名:Qiqiu 该类提供一个Daqi的方法,每执行一次,x(记录气球的体积)的值+1,如果x的值大于max,则触发自定义的Change事件. 为节省细节不使用属性过程,变量直接用public 1 Public Event Change(q As qiqiu) 'Ev