You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA函数修改需求:按指定规则提取字符串中的单个数字

自定义VBA函数GetNumeric修改实现

原函数仅能提取字符串中所有数字并拼接,现需修改为按以下规则提取单个数字:

  • 目标数字为1或2位整数,或带小数部分的1-2位数字(如8、8.5、36均符合,123不符合)
  • 优先提取紧跟在"、'、inch或in之前的符合长度要求的数字,找到后直接返回
  • 若不存在符合上一条的数字,则返回字符串中第一个符合长度要求的数字
  • 无符合条件的数字时返回空值

规则示例

当前字符串预期结果
INSPECT-8'' Water 12 Pipe8
INSPECT- 8.5" Water 128.5
INSPECT- 4 Water 5.5"5.5
PM- 6.5 inch From H446.5
PM-36in Pipe M1T36
PM-36 Pipe From M2T36
PM-18"*12" Pipe From M1T18
PM-36 From 5" M1T5
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

代码说明

  1. 采用VBScript正则表达式实现模式匹配,相比原逐个字符遍历的方式更高效精准
  2. 正则模式解析:
    • (\d{1,2}(?:\.\d+)?):匹配1-2位数字,(?:\.\d+)?表示可选的小数部分(非捕获组,避免多余匹配结果)
    • (?=[""']|inch|in):正向预查,确保数字后紧跟指定单位标识(不捕获单位本身)
  3. 逻辑优先级:先找带单位的目标数字,找不到则取第一个符合长度要求的数字,均无则返回空值

内容的提问来源于stack exchange,提问作者Waleed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:12:51