我需要一些公式重新排列名称的帮助。我发现很多公式在某些情况下有效,但没有一个可以处理我遇到的所有情况。
简而言之,这是名称列表和所需的输出:
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..
答案 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代码模块表中使用它之后,就像使用任何其他工作表公式一样使用它。例如:
答案 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))