Разделить полное имя на фамилию, имя, если фамилия состоит из нескольких частей (например, van, de) - PullRequest
1 голос
/ 02 июля 2019

У меня есть список с несколькими именами, однако некоторые имена имеют несколько фамилий: Пример. «Эдди ван Хален. Я не могу вывести мой код:« Ван Хален, Эдди », вместо этого он выдает:« Ван, Эдди »

Был бы способ проверить, содержит ли names () более 2 частей, и если да, включить в качестве фамилии имена (1) и имена (2) вместо проверки на "van". То есть, если фамилия включает в себя другие части, такие как «де».

Дополнительно, если полное имя не состоит из нескольких частей, например: "волонтер", код должен пропустить это имя.

Вот мой текущий код:

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 ]

2 голосов
/ 02 июля 2019

Split принимает третий аргумент, «Limit», который можно использовать, чтобы остановить разделение, если в результате будет столько записей.

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

В этом случае names всегда будет иметь не более 2элементы.

0 голосов
/ 02 июля 2019

Как вариант, вы можете использовать регулярное выражение.Следующее регулярное выражение соответствует всем словам, которые не начинаются с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...