将全名解析为多个部分

问题描述 投票:0回答:1

我有一份全名列表,其中可能不包括中间名、中间名首字母和后缀。

我想将名称解析为适当的单独列,如下所示。 (后缀目前可以包括 Jr、Jr.、Sr、Sr.、II、III、IV 和 V...。)

我最接近的是这段代码:(其中

emptyRow
已被确定为第一个没有数据的可用行)

Dim MyText As String
Dim i As Integer
Dim MyResult() As String
  
MyText = Range("A" & emptyRow).Value
MyResult = Split(MyText)

For i = 0 To UBound(MyResult)
    Cells(emptyRow, i).Value = MyResult(i)
Next I

但是,它对丢失的项目(例如中间名或后缀)没有任何作用。

(A1)全名 (B1)名字 (C1)中间名 (D1)姓氏 (E1)后缀
小约翰·亚当·多伊 约翰 亚当 母鹿
小约翰·A·多伊 约翰 A 母鹿 Jr
小约翰·多伊 约翰 母鹿 Jr
约翰·亚当·多伊 约翰 亚当 母鹿
约翰·A·多伊 约翰 A 母鹿
约翰·多伊 约翰 母鹿

更新:

这就是我的想法。我认为它有效。

MyResult = Split(MyText)
i = UBound(MyResult)
Cells(emptyRow, 1).Value = MyResult(0)
If MyResult(i) = "Jr." Or MyResult(i) = "Jr" Or MyResult(i) = "Sr." Or MyResult(i) = "Sr" Or MyResult(i) = "II" Or MyResult(i) = "ii" Or MyResult(i) = "III" Or MyResult(i) = "IIi" Or MyResult(i) = "Iii" Or MyResult(i) = "IiI" Or MyResult(i) = "iii" Or MyResult(i) = "iIi" Or MyResult(i) = "iiI" Or MyResult(i) = "iII" Or MyResult(i) = "iI" Or MyResult(i) = "Ii" Or MyResult(i) = "IV" Or MyResult(i) = "V" Or MyResult(i) = "iv" Or MyResult(i) = "v" Or MyResult(i) = "Iv" Or MyResult(i) = "iV" Then
    If i = 5 Then
        Cells(emptyRow, 4).Value = MyResult(i)
        Cells(emptyRow, 3).Value = MyResult(3) & " " & MyResult(4)
        Cells(emptyRow, 2).Value = MyResult(1) & " " & MyResult(2)
        ElseIf i = 4 Then
            Cells(emptyRow, 4).Value = MyResult(i)
            Cells(emptyRow, 3).Value = MyResult(2) & " " & MyResult(3)
            Cells(emptyRow, 2).Value = MyResult(1)
        ElseIf i = 3 Then
            Cells(emptyRow, 4).Value = MyResult(i)
            Cells(emptyRow, 3).Value = MyResult(2)
            Cells(emptyRow, 2).Value = MyResult(1)
        Else
            Cells(emptyRow, 4).Value = MyResult(i)
            Cells(emptyRow, 3).Value = MyResult(1)
    End If
    ElseIf i = 4 Then
        Cells(emptyRow, 3).Value = MyResult(3) & " " & MyResult(4)
        Cells(emptyRow, 2).Value = MyResult(1) & " " & MyResult(2)
        ElseIf i = 3 Then
            Cells(emptyRow, 3).Value = MyResult(2) & " " & MyResult(3)
            Cells(emptyRow, 2).Value = MyResult(1)
        ElseIf i = 2 Then
            Cells(emptyRow, 3).Value = MyResult(2)
            Cells(emptyRow, 2).Value = MyResult(1)
        Else
            Cells(emptyRow, 3).Value = MyResult(1)
End If
excel vba parsing
1个回答
0
投票

这是我的看法。我选择在中间名或姓氏中使用额外的名字。它制作得很快,而且是相当基本的方法,我确信有多种方法可以改进它,但无论如何它都运行良好。

尝试一下。只需设置和更改必要的部分即可。

Sub ExtractName()

Dim ws As Worksheet, lRow As Long, i As Long, SplitName, IsSuffix As Boolean
Dim LastNamePos As Integer, j As Integer, SplitLast As Integer, LastStart As Integer

Set ws = Sheets("Sheet1")
lRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row 'Change column as needed

With ws
    For i = 2 To lRow 'change starting row if needed
        SplitName = Split(.Range("A" & i), " ")
        SplitLast = UBound(SplitName)
        Select Case SplitName(SplitLast)
            Case "Jr", "Jr.", "Sr", "Sr.", "II", "III", "IV", "V"
                .Range("E" & i) = SplitName(SplitLast) 'Add Suffix to column
                IsSuffix = True
            Case Else
                IsSuffix = False
        End Select
        .Range("B" & i) = SplitName(0) 'Add first name to column

        If IsSuffix = True Then
            LastNamePos = 1
        Else
            LastNamePos = 0
        End If
        '---------------------- Extra names go to middle name
        .Range("D" & i) = SplitName(SplitLast - LastNamePos) 'Add last name to column
        For j = 1 To SplitLast - LastNamePos - 1 'Add middle names to column
            If .Range("C" & i) = "" Then
                .Range("C" & i) = SplitName(j)
            Else
                .Range("C" & i) = .Range("C" & i) & " " & SplitName(j)
            End If
        Next j
        '---------------------- Extra names go to last name
'        If IsSuffix = True And SplitLast >= 3 Then
'            .Range("C" & i) = SplitName(1)
'            LastStart = 2
'        ElseIf IsSuffix = False And SplitLast >= 2 Then
'            .Range("C" & i) = SplitName(1)
'            LastStart = 2
'        Else
'            LastStart = 1
'        End If
'        For j = LastStart To SplitLast - LastNamePos
'            If .Range("D" & i) = "" Then
'                .Range("D" & i) = SplitName(j)
'            Else
'                .Range("D" & i) = .Range("D" & i) & " " & SplitName(j)
'            End If
'        Next j
    Next i
End With

End Sub
© www.soinside.com 2019 - 2024. All rights reserved.