VBA 将文本与数字分开
VBA Separating text from numbers
我不得不快速将文本与数字分开,但也有一些例外。实际上它是关于将名称与 ID 分开。代码将文本与数字完全分开,但一些 ID 的开头有一个字母。所以问题就从这个地方开始。必须在代码中添加和更改什么才能获得带字母的完整 ID(如果适用)?
感谢帮助!
Option Explicit
Sub NamesandID()
Dim RowNum As Long
Dim eChar As Integer
RowNum = 2
Do Until Cells(RowNum, 1).Value = ""
For eChar = 1 To Len(Cells(RowNum, 1))
If IsNumeric(Mid(Cells(RowNum, 1), eChar, 1)) = True Then
Cells(RowNum, 3).Value = Cells(RowNum, 3).Value _
& Mid(Cells(RowNum, 1), eChar, 1)
Else
Cells(RowNum, 2).Value = Cells(RowNum, 2).Value _
& Mid(Cells(RowNum, 1), eChar, 1)
End If
Next
RowNum = RowNum + 1
Loop
End Sub
你可以用公式来做到这一点:
Name-column: =MID([@worker],1,FIND("(", [@worker])-1)
ID-column: =MID([@worker],FIND("(",[@worker])+1,FIND(")",[@worker])-FIND("(",[@worker])-1)
如果您在 excel 365 的 Beta-Channel,那么您可能已经拥有 TEXTSPLIT
和 TEXTBEFORE
。
我的两分钱。
1):通过公式:
B2
中的公式:
=LET(X,TEXTAFTER(TEXTBEFORE(A2:A5,")"),"("),HSTACK(SUBSTITUTE(A2:A5," ("&X&")","",1),X))
2) 通过 VBA:
Sub Test()
Dim arr As Variant: arr = Array("Ann Smith (A123456)", "Tom Ford(2453234)", "Alex Mohammet(4447434)(Text)", "Gerard Kowalski(A6739263)")
With CreateObject("vbscript.regexp")
.Pattern = "^(.+?)\s*\(([A-Z]?\d+)\)(.*)$"
For Each el In arr
tmp = .Replace(el, "|")
Debug.Print Split(tmp, "|")(0) 'Print name
Debug.Print Split(tmp, "|")(1) 'Print ID
Next
End With
End Sub
对于那些对所用正则表达式的细分感兴趣的人,请遵循 this link。
VBA 的另一种选择是使用 Split()
,例如:
Sub Test()
Dim arr As Variant: arr = Array("Ann Smith (A123456)", "Tom Ford (2453234)", "Alex Mohammet (4447434)(Text)", "Gerard Kowalski (A6739263)")
Dim tmp As String
For Each el In arr
tmp = Split(Split(el, "(")(1), ")")(0)
Debug.Print Application.Trim(Replace(el, "(" & tmp & ")", "")) 'Print Name
Debug.Print tmp 'Print ID
Next
End Sub
两个选项都会打印:
Sub NamesandID()
Dim RowNum As Long
RowNum = 2
Do Until Cells(RowNum, 1).Value = ""
'f you need parenthesis in the name concatenate them at the end, something like below
'Range("B" & RowNum).Value = Split(Range("A" & RowNum), " (")(0) & " ()"
Range("B" & RowNum).Value = Split(Range("A" & RowNum), " (")(0) 'no parenthesis at the end
Range("C" & RowNum).Value = Split(Split(Range("A" & RowNum), " (")(1), ")")(0)
RowNum = RowNum + 1
Loop
End Sub
我不得不快速将文本与数字分开,但也有一些例外。实际上它是关于将名称与 ID 分开。代码将文本与数字完全分开,但一些 ID 的开头有一个字母。所以问题就从这个地方开始。必须在代码中添加和更改什么才能获得带字母的完整 ID(如果适用)?
感谢帮助!
Option Explicit
Sub NamesandID()
Dim RowNum As Long
Dim eChar As Integer
RowNum = 2
Do Until Cells(RowNum, 1).Value = ""
For eChar = 1 To Len(Cells(RowNum, 1))
If IsNumeric(Mid(Cells(RowNum, 1), eChar, 1)) = True Then
Cells(RowNum, 3).Value = Cells(RowNum, 3).Value _
& Mid(Cells(RowNum, 1), eChar, 1)
Else
Cells(RowNum, 2).Value = Cells(RowNum, 2).Value _
& Mid(Cells(RowNum, 1), eChar, 1)
End If
Next
RowNum = RowNum + 1
Loop
End Sub
你可以用公式来做到这一点:
Name-column: =MID([@worker],1,FIND("(", [@worker])-1)
ID-column: =MID([@worker],FIND("(",[@worker])+1,FIND(")",[@worker])-FIND("(",[@worker])-1)
如果您在 excel 365 的 Beta-Channel,那么您可能已经拥有 TEXTSPLIT
和 TEXTBEFORE
。
我的两分钱。
1):通过公式:
B2
中的公式:
=LET(X,TEXTAFTER(TEXTBEFORE(A2:A5,")"),"("),HSTACK(SUBSTITUTE(A2:A5," ("&X&")","",1),X))
2) 通过 VBA:
Sub Test()
Dim arr As Variant: arr = Array("Ann Smith (A123456)", "Tom Ford(2453234)", "Alex Mohammet(4447434)(Text)", "Gerard Kowalski(A6739263)")
With CreateObject("vbscript.regexp")
.Pattern = "^(.+?)\s*\(([A-Z]?\d+)\)(.*)$"
For Each el In arr
tmp = .Replace(el, "|")
Debug.Print Split(tmp, "|")(0) 'Print name
Debug.Print Split(tmp, "|")(1) 'Print ID
Next
End With
End Sub
对于那些对所用正则表达式的细分感兴趣的人,请遵循 this link。
VBA 的另一种选择是使用 Split()
,例如:
Sub Test()
Dim arr As Variant: arr = Array("Ann Smith (A123456)", "Tom Ford (2453234)", "Alex Mohammet (4447434)(Text)", "Gerard Kowalski (A6739263)")
Dim tmp As String
For Each el In arr
tmp = Split(Split(el, "(")(1), ")")(0)
Debug.Print Application.Trim(Replace(el, "(" & tmp & ")", "")) 'Print Name
Debug.Print tmp 'Print ID
Next
End Sub
两个选项都会打印:
Sub NamesandID()
Dim RowNum As Long
RowNum = 2
Do Until Cells(RowNum, 1).Value = ""
'f you need parenthesis in the name concatenate them at the end, something like below
'Range("B" & RowNum).Value = Split(Range("A" & RowNum), " (")(0) & " ()"
Range("B" & RowNum).Value = Split(Range("A" & RowNum), " (")(0) 'no parenthesis at the end
Range("C" & RowNum).Value = Split(Split(Range("A" & RowNum), " (")(1), ")")(0)
RowNum = RowNum + 1
Loop
End Sub