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

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

简而言之,这里是名字的列表,以及所需的输出:

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(PROPER(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) A1,1)-1))))

它用我find的一些其他公式拼凑在一起,如果它们存在,则删除中间的首字母,但如果它们存在的话,则不包含中间的首字母。

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

 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 

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

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

名称解析

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

 =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))