簡體   English   中英

如果姓氏包含多個部分(例如,van,de),則將全名分為姓氏,名字

[英]Split full name into lastname,firstname if lastname has multiple parts (i.e. van, de)

我有一個包含多個名稱的列表,但是,有些名稱具有多個姓氏:例如。 “ 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

Split使用第三個參數“ Limit”,一旦結果有那么多條目,該參數可用於停止拆分。

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

在這種情況下, names將始終最多包含2個元素。

作為一種選擇,您可以使用正則表達式。 以下正則表達式匹配所有不以vanvonde等開頭的單詞。您可以隨意添加單詞。 作為一個特例,名稱本身可以以vanvon (例如Vonder)開頭。 為了處理這種情況,我在排除項的匹配項中添加了\\b ,因此這些前綴必須是獨立的。 正如@ScottCraner所指出的,另一種情況是三個部分的名稱(例如, Mary Lou Smith在他的示例中)。 在這種情況下,您可以使用匹配Countx變量)來操縱這些情況。 例如,如果有三個名稱,則可以串聯任何部分。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM