如果姓氏包含多个部分(例如,范,德),则将全名拆分为姓氏,

时间:2019-07-02 16:59:17

标签: excel vba

我有一个包含多个名称的列表,但是,有些名称具有多个姓氏:例如。 “ Eddie van Halen。我无法输出代码:“ van Halen,Eddie”,而是输出:“ Van,Eddie”

是否有一种方法可以检查names()是否包含2个以上的部分,如果可以,请包含names(1)和names(2)作为姓氏,而不是检查“ van”。也就是说,如果姓氏包含“ de”等其他部分。

此外,如果全名没有多个部分,例如:“ volunteer”,则代码应跳过此名称。

这是我当前的代码:

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

2 个答案:

答案 0 :(得分:2)

Split带有第三个参数“ Limit”,一旦结果有那么多条目,该参数可用于停止拆分。

    names = Split(c.Value, " ", 2)

在这种情况下,names将始终最多包含2个元素。

答案 1 :(得分:0)

作为一种选择,您可以使用正则表达式。以下正则表达式匹配所有以 van von de 等开头的单词。您可以随意添加单词。作为一个特例,名称本身可以以 van von (例如Vonder)开头。为了处理这种情况,我在排除项的匹配项中添加了\b,因此这些前缀必须是独立的。正如@ScottCraner指出的,另一种情况是三个部分的名称(例如在他的示例中为Mary Lou Smith)。在这种情况下,您可以使用Count个匹配项(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 Sub