如何从仅包含数字 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
我有一个包含 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