我有一个有多个名字的列表,但是,有些名字有多个姓氏:例如。"Eddie van Halen。我不能让我的代码输出:"van Halen,Eddie",而是输出:"Van,Eddie“
有没有办法检查names()是否有两个以上的部分,如果有,就把names(1) & names(2)作为姓氏,而不是检查"van“。也就是说,如果一个姓氏包含其他部分,比如"de“。
另外,如果全名没有多个部分,例如:“志愿者”,代码应该跳过这个名称。
下面是我当前的代码:
Sub Filter()
Dim r As Range
Dim c As Range
Dim names() As String
Dim lastrow As Long
lastrow = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
With ActiveSheet
Set r = .Range("K3:K" & lastrow)
For Each c In r
names = Split(c.Value, " ")
If IsEmpty(c.Value) Then Exit Sub
ElseIf InStr(c.Value, "van") > 0 Then
c.Value = names(1) & names(2) & ", " & names(0)
Else
c.Value = names(1) & ", " & names(0)
End If
Next c
End With
End Sub发布于 2019-07-03 01:13:07
Split接受第三个参数"Limit",一旦结果有那么多条目,就可以用它来停止拆分。
names = Split(c.Value, " ", 2)在这种情况下,names将始终具有最多2个元素。
发布于 2019-07-03 01:57:35
作为选择,您可以使用正则表达式。下面的正则表达式匹配所有不以van、von、de等开头的单词。您可以随意添加您的单词。作为边缘情况,名称本身可以以van或von开头(例如,Vonder)。为了处理这种情况,我在排除的match中添加了\b,因此这些前缀必须是独立的。另一种情况,正如@ScottCraner所指出的,是三个部分的名称(就像他示例中的Mary Lou Smith )。在这种情况下,您可以使用Count of matches (x变量)来处理这些情况。例如,如果有三个名称,您可以连接任何部分。
Sub F()
'// Tools -> References -> Microsoft VBSscript Regular Expressions 5.5
Dim re As RegExp, mc As MatchCollection, m As Match, s$, x%
Set re = New RegExp
re.IgnoreCase = True
re.Global = True
re.Pattern = "\b(?!(van|von|de)\b)[a-z]+"
Set mc = re.Execute("van Halen, Vanzen")
If mc.Count > 0 Then
For x = 0 To mc.Count - 1
MsgBox mc(x)
Next
Else
MsgBox "No matches were found.", vbExclamation
End If
'// Output:
'// Halen
'// Vanzen
End Subhttps://stackoverflow.com/questions/56857103
复制相似问题