Excel公式重新排列LastName,Firstname MiddleInitial为FirstName Lastname

时间:2015-07-07 23:20:24

标签: excel excel-formula

我需要一些公式重新排列名称的帮助。我发现很多公式在某些情况下有效,但没有一个可以处理我遇到的所有情况。

简而言之,这是名称列表和所需的输出:

Original names              Desired Output
John, James J               James John
Junior, Lake                Lake Junior
Mitchel, Fields M           Fields Mitchel
Rothschild Jr., Michael K   Michael Rotschild
Sally, Sue L                Sue Sally
Rinkel, Michael             Michael Rinkel
Rivel, Nicholas L           Nicholas Rivel
Hurwitz Sr., Susan          Susan Hurwitz

我到目前为止的公式是:= TRIM(正确(TRIM(IF(ISERROR(FIND(“,”,A1,1)),A1,MID(A1,FIND(“,”,A1,1)) + 1,IF(ISERROR(FIND(“”,A1,FIND(“,”,A1,1)+2)),LEN(A1),FIND(“”,A1,FIND(“,”,A1,1) )+2)) - FIND(“,”,A1,1))))&“”& LEFT(A1,IF(ISERROR(FIND(“,”,A1,1)),LEN(A1), FIND( “”,A1,1)-1))))

它从我发现的其他一些公式拼凑而成,并且如果它们存在则消除中间的首字母,但如果它们存在则不是Sr.或Jr..

2 个答案:

答案 0 :(得分:1)

解析名称有很多细微差别,只要你认为已经涵盖所有可能性,就会有新的问题出现。如果保留用户定义的公式(也称为UDF),则可以快速添加新的编码过程以解决新问题。

Public Function fcn_First_Last_Name(sNAM As String)
    Dim sTMP As String, v As Long, vDELs As Variant, vNAMs As Variant
    sTMP = Application.Trim(sNAM)
    vDELs = Array(" Jr.", " Sr.", " III", " II")
    sTMP = Replace(sTMP, Chr(160), Chr(32))
    For v = LBound(vDELs) To UBound(vDELs)
        sTMP = Replace(sTMP, vDELs(v), vbNullString, compare:=vbTextCompare)
    Next v
    If Asc(Mid(sTMP, Len(sTMP) - 1, 1)) = 32 Then sTMP = Trim(Left(sTMP, Len(sTMP) - 1))
    vNAMs = Split(sTMP, Chr(44))
    If CBool(UBound(vNAMs)) Then
        fcn_First_Last_Name = vNAMs(UBound(vNAMs)) & Chr(32) & vNAMs(LBound(vNAMs))
    Else
        fcn_First_Last_Name = vNAMs(UBound(vNAMs))
    End If
End Function

这应该让你开始。当你添加新的例程来弥补新的困难时,它也应该被证明是一个很好的学习经历。

在VBA代码模块表中使用它之后,就像使用任何其他工作表公式一样使用它。例如:

Name Parsing

答案 1 :(得分:1)

另一种可能性,但非常笨重:

=MID(A2,FIND(", ",A2,1)+2,IFERROR((FIND(" ",A2,FIND(", ",A2,1)+2)-4)-FIND(", ",A2,1)+2,LEN(A2)))&" "&IFERROR(LEFT(A2,FIND(" ",LEFT(A2,FIND(", ",A2,1)-1))-1),LEFT(A2,FIND(", ",A2,1)-1))