【问题标题】:Extract four numbers without brackets from a bracketed entry, if entry exists如果条目存在,则从带括号的条目中提取四个不带括号的数字
【发布时间】:2015-03-14 05:42:24
【问题描述】:

我有什么:

  • B 列中包含大约 1000 个报告标题的列表。
  • 其中一些标题在文本和数字字符串的某处有一个用括号括起来的四位数字(例如:(3672))。
  • 我想在同一行的 C 列中提取这四个数字 - 不带括号
  • 如果B列中没有带括号的四位数字,则在C列中返回“”。

到目前为止我所拥有的:

我可以成功识别 B 列中的单元格,这些单元格中有四位数字用括号括起来。问题是它返回了包括四个数字在内的整个标题。

取自:VBA RegEx extracting data from within a string

注意:我正在使用 Excel Professional Plus 2010,已选中“Microsoft VBScript 正则表达式 5.5”旁边的框。

Sub ExtractTicker()

Dim regEx
Dim i As Long
Dim pattern As String
Set regEx = CreateObject("VBScript.RegExp")
regEx.IgnoreCase = True
regEx.Global = True
regEx.pattern = "(\()([0-9]{4})(\))"

For i = 2 To ActiveSheet.UsedRange.Rows.Count
    If (regEx.Test(Cells(i, 2).Value)) Then
        Cells(i, 3).Value = regEx.Replace(Cells(i, 2).Value, "$2")
    End If
Next i

End Sub

【问题讨论】:

    标签: regex vba


    【解决方案1】:

    试试

    regEx.pattern = "(.*\()([0-9]{4})(\).*)"

    .* 和字符串的开头和结尾确保您捕获整个字符串,然后将其完全替换为第二个子匹配 ([0-9]{4}) p>

    全面优化代码

    • 使用变量数组而不是范围
    • 当您对完整字符串运行不区分大小写的匹配时,设置 GlobalIgnoreCase 是多余的
    • 您使用的是后期绑定,因此您不需要参考

    代码

    Sub ExtractTicker()
    
    Dim regEx As Object
    Dim pattern As String
    Dim X
    Dim lngCNt As Long
    
    X = Range([b1], Cells(Rows.Count, "B").End(xlUp)).Value2
    Set regEx = CreateObject("VBScript.RegExp")
    
    With regEx
        .pattern = "(.*\()([0-9]{4})(\).*)"
        For lngCNt = 1 To UBound(X)
            If .Test(X(lngCNt, 1)) Then
                X(lngCNt, 1) = .Replace(X(lngCNt, 1), "$2")
            Else
                X(lngCNt, 1) = vbNullString
            End If
        Next
    End With
    
    [c1].Resize(UBound(X, 1), 1).Value2 = X
    
    End Sub
    

    【讨论】:

    • 嗨,brettdj,代码就像一个魅力。非常感谢对代码的清晰解释。非常感谢。
    • FWIW 您不需要捕获周围的文本。 .*\((\d{4})\).* 就足够了(并使用 $1 替换)
    • 在这种情况下是正确的 - 尽管简化很小。我使用了适用于此类情况的默认模式,以便我可以访问字符串的所有 3 个部分(前缀、匹配、后缀),以防我想修改替换。谢谢你的评论。
    猜你喜欢
    • 2016-06-11
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多