如何从仅包含数字 s 的 Excel 文本字符串中删除最后一组括号

How to remove the LAST set Parentheses from a Excel text string that contains only numeric s

我有一个包含 50,000 多个条目的 excel 电子表格。这些条目有一个名称和地址,有时还有一个 phone 数字全部在同一个字符串中。我专注于字符串的 phone 数字部分,它始终位于末尾并括在括号中。我一直在尝试使用 VBA 代码来解决这个问题。 如何从括号之间仅包含数字的 Excel 文本字符串中删除最后一组括号。在任何给定的字符串中,可能没有括号或多个括号,但我只想删除最后一组并保留字符串中包含的数字

示例字符串 "Toone Carkeet J., agt.,Alliance Assurance Co. Ltd. (Provident Life branch), 3 St. Andrew st. (1936)" 我曾尝试使用 VBScript.RegExp 来定义“(1936)”,但我无法让 RegExp 匹配字符串并将括号 () 替换为 " ".

For Each Cell In Range
    If strPattern<> "" Then
        strInput = Cell
        With regEx
            .Pattern="\(([0-9]))*)"
            .Global=False
        End With
        If .Pattern= True Then
            Replace(Cell.Value, "(","")
        End If

这里有两个不依赖于正则表达式的快速用户定义函数。第一个使用 VBA 的 StrReverse,第二个使用 InStrRev。

Function RemoveParens1(str As String)

    str = StrReverse(str)

    str = Replace(str, "(", vbNullString, 1, 1)
    str = Replace(str, ")", vbNullString, 1, 1)

    RemoveParens1 = StrReverse(str)

End Function

Function RemoveParens2(str As String)

    Dim o As Integer, c As Integer

    o = InStrRev(str, "(")
    c = InStrRev(str, ")")

    str = Left(str, c - 1) & Mid(str, c + 1)
    str = Left(str, o - 1) & Mid(str, o + 1)

    RemoveParens2 = str

End Function

如果您不想使用 UDF,只需选择您喜欢的逻辑方法并根据自己的目的进行调整。

这里还有一个使用正则表达式的替换。

Function RemoveParens3(str As String)

    Static rgx As Object, cmat As Object, tmp As String

    If rgx Is Nothing Then Set rgx = CreateObject("vbscript.regexp")

    With rgx
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = "\([0-9]*\)"

        If .test(str) Then
            Set cmat = .Execute(str)
            tmp = cmat.Item(cmat.Count - 1)
            tmp = Mid(tmp, 2, Len(tmp) - 2)
            str = .Replace(str, tmp)
        End If
    End With

    RemoveParens3 = str

End Function

这是一个使用与您类似的逻辑的示例。 我更改了范围变量的名称,因为对命名变量使用关键字不是一个好主意,即使编辑器允许这样做也是如此。

我们不只是删除括号,而是将整个 (nnnn) 子字符串与捕获组中的数字进行匹配,然后仅用捕获的组替换该匹配项。

如果没有匹配项,替换将不会执行任何操作,因此无需测试。

另外,请注意我们在循环外设置了正则表达式。

With regEx
    .Pattern = "\((\d+)\)"
    .Global = False
End With

For Each myCell In myRange
    myCell = regEx.Replace(myCell, "")
Next myCell

如有必要,由于其他子字符串具有相同的模式,您可以更改模式以确保匹配位于行尾,或者它是字符串中该类型的最后一个模式。

例如:

  • 行尾的子字符串

\((\d+)\)$
  • 子串最后一个

\((\d+)\)(?!.*\(\d+\))

如果您的字符串在单元格中位于多行中,则可能还需要进行其他修改。

Dim x, y, z As Long
x = 2 'ASSUMING YOUR DATA START AT RANGE A2
With Sheet1
Do While .Cells(x, 1).Value <> ""
    If Right(.Cells(x, 1).Value, 1) = ")" Then
        .Cells(x, 1).Value = Replace(.Cells(x, 1).Value, ")", "")
        z = VBA.Len(.Cells(x, 1).Value)
        For y = z To 1 Step -1
            If Mid(.Cells(x, 1).Value, y, 1) = "(" Then
                .Cells(x, 1).Value = Replace(.Cells(x, 1).Value, "(", "")
                Exit For
            End If
        Next y

        x = x + 1
    End If
Loop
End With