VBA函数修改需求:按指定规则提取字符串中的单个数字
自定义VBA函数GetNumeric修改实现
原函数仅能提取字符串中所有数字并拼接,现需修改为按以下规则提取单个数字:
- 目标数字为1或2位整数,或带小数部分的1-2位数字(如
8、8.5、36均符合,123不符合) - 优先提取紧跟在
"、'、inch或in之前的符合长度要求的数字,找到后直接返回 - 若不存在符合上一条的数字,则返回字符串中第一个符合长度要求的数字
- 无符合条件的数字时返回空值
规则示例
| 当前字符串 | 预期结果 |
|---|---|
| INSPECT-8'' Water 12 Pipe | 8 |
| INSPECT- 8.5" Water 12 | 8.5 |
| INSPECT- 4 Water 5.5" | 5.5 |
| PM- 6.5 inch From H44 | 6.5 |
| PM-36in Pipe M1T | 36 |
| PM-36 Pipe From M2T | 36 |
| PM-18"*12" Pipe From M1T | 18 |
| PM-36 From 5" M1T | 5 |
| PM-123 Pipe From MT |
修改后的VBA代码
Public Function GetNumeric(CellRef As String) As Variant Dim regex As Object Set regex = CreateObject("VBScript.RegExp") regex.Global = True regex.IgnoreCase = True ' 忽略大小写,兼容INCH、In等写法 ' 优先匹配带单位后缀的目标数字:1-2位数字(可带小数),后跟"、'、inch或in regex.Pattern = "(\d{1,2}(?:\.\d+)?)(?=[""']|inch|in)" If regex.Test(CellRef) Then GetNumeric = regex.Execute(CellRef)(0).SubMatches(0) Exit Function End If ' 无带单位数字时,匹配第一个1-2位(可带小数)的数字 regex.Pattern = "\d{1,2}(?:\.\d+)?" If regex.Test(CellRef) Then GetNumeric = regex.Execute(CellRef)(0).Value Exit Function End If ' 无符合条件的数字,返回空 GetNumeric = "" End Function
代码说明
- 采用VBScript正则表达式实现模式匹配,相比原逐个字符遍历的方式更高效精准
- 正则模式解析:
(\d{1,2}(?:\.\d+)?):匹配1-2位数字,(?:\.\d+)?表示可选的小数部分(非捕获组,避免多余匹配结果)(?=[""']|inch|in):正向预查,确保数字后紧跟指定单位标识(不捕获单位本身)
- 逻辑优先级:先找带单位的目标数字,找不到则取第一个符合长度要求的数字,均无则返回空值
内容的提问来源于stack exchange,提问作者Waleed
相关产品推荐
相关产品推荐

