Excel VBA 自定义函数 使用正则表达式提取子字符串(不是详细教程)

新建一个Excel工作表

然后打开Excel自带的VBA开发环境

导入一个库

选择 工具 > 引用

导入下面选中的库,第一次导入需要使劲往下翻,界面特别蛋疼

 GIF

 

然后粘贴下面的代码

 

复制代码
Public Function RegexSubString(text As String, pattern As String, Optional matcheIndex As Integer = 0, Optional subMatcheIndex As Integer = -1, Optional ignoreCase As Boolean = False, Optional multiLine As Boolean = True, Optional defaultText As String = "") As String

' text 参数 待匹配的文本
' pattern 参数 正则表达式或者说模式文本
' matcheIndex 参数(可选) 第几个匹配项的索引,0是开头第一个,-1是末尾第一个依次类推
' subMatcheIndex 参数(可选) 匹配项中子匹配项的索引,从0开始,默认值是-1代表返回完整匹配项
' ignoreCase 参数(可选) 如果为 True,则匹配忽略字母大小写
' multiLine 参数(可选) 如果为 True,则模式匹配发生在换行符之间
' defaultText 参数(可选) 假如没有匹配项则返回的默认文本,假如有匹配项但是子匹配项索引错误也会返回此值

Dim RegEx As New RegExp

With RegEx

.Global = True 'True,则找到字符串中模式的所有匹配项。如果为 False,则仅找到第一个匹配项

.ignoreCase = ignoreCase

.multiLine = multiLine

.pattern = pattern

End With

Dim ms As MatchCollection, m As Match, gs As SubMatches


Set ms = RegEx.Execute(text)

If ms.Count = 0 Then
    RegexSubString = defaultText
    Exit Function
End If




Dim index As Integer

If matcheIndex >= 0 Then
    index = matcheIndex
Else
    index = ms.Count + matcheIndex
End If
    

If index >= 0 And index < ms.Count Then
    Set m = ms.Item(index)
Else
    RegexSubString = defaultText
    Exit Function
End If


Set gs = m.SubMatches

If subMatcheIndex = -1 Then
    RegexSubString = m.Value
    Exit Function
ElseIf subMatcheIndex >= 0 And subMatcheIndex < gs.Count Then
    RegexSubString = gs.Item(subMatcheIndex)
Else
    RegexSubString = defaultText
    Exit Function
End If


End Function
复制代码

 

 

 

GIF

 

 关闭VBA开发环境,但不关闭工作表,然后把这个工作表另存为加载宏,因为excel有些历史记录关不掉,所以GIF录得区域过小,但是应该能看懂

 

 

 

然后关闭该工作表,打开其他工作表,然后才去点击Excel加载项,加载项的名字就是你另存为时输入的名字

 

 

 简单使用示例

 

 

 

 

 

 

 

后面附一个使用正则表达式替换文本的VBA脚本

复制代码
Public Function RegexReplace(text As String, pattern As String, replaceText As String, Optional replaceAll As Boolean = False, Optional ignoreCase As Boolean = False, Optional multiLine As Boolean = True) As String

' text 参数 待匹配的文本
' pattern 参数 正则表达式或者说模式文本
' replaceText 参数 用来替换的文本,可以使用 $1 来引用第一个子匹配项,依次类推
' replaceAll 参数(可选) 是否替换所有匹配项
' ignoreCase 参数(可选) 如果为 True,则匹配忽略字母大小写
' multiLine 参数(可选) 如果为 True,则模式匹配发生在换行符之间

Dim RegEx As New RegExp

With RegEx

.Global = replaceAll 'True,则找到字符串中模式的所有匹配项。如果为 False,则仅找到第一个匹配项

.ignoreCase = ignoreCase

.multiLine = multiLine

.pattern = pattern

End With

RegexReplace = RegEx.Replace(text, replaceText)

End Function
复制代码

 

简单使用示例

 

posted @   FfD4edyo  阅读(1421)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示