2011-05-26 64 views
27

我在列中有名称。我需要将该列中的姓氏拆分为另一列。从单元格中提取最后一个子字符串

姓氏由右侧的空格分隔。

在细胞A2 = Alistair Stevens内容和我进入细胞B2式(I需要'Stevens'在细胞B2

我使用下列公式尝试:

=RIGHT(A2,FIND(" ",A2,1)-1) 

=RIGHT(A2,FIND(" ",A2)) 

这两个公式工作为这个单元格,但是当我填充它/将它复制并粘贴到下面的单元格时,它不起作用。我得到错误的价值!

A3 -> David Mckenzie 

B3 -> Mckenzie 
+0

请张贴A3的内容和由此产生的B3 – 2011-05-26 03:14:28

回答

42

这工作,即使有中间名:。

=MID(A2,FIND(CHAR(1),SUBSTITUTE(A2," ",CHAR(1),LEN(A2)-LEN(SUBSTITUTE(A2," ",""))))+1,LEN(A2)) 

如果你想要的一切,但最后的名字,看看this answer

如果有你的名字尾随空格,那么你可能想要通过r删除它们在上面的公式中用TRIM(A2)代替A2的所有实例。

请注意,它只是纯粹的机会,你的第一个公式=RIGHT(A2,FIND(" ",A2,1)-1)种作品为Alistair Stevens。这是因为"Alistair"" Stevens"碰巧包含相同数量的字符(如果您计数" Stevens"中的前导空格)。

+0

excel高手,感谢让弗朗索瓦!完美作品 – 2013-10-27 21:58:35

+0

这太棒了!如果名字是Sammy L Davis Jr,该怎么办?我如何让它忽略Jr,Sr,III等? – bteague 2018-02-14 18:49:59

+0

@bteague试试吧! – 2018-02-15 08:26:29

-1

RIGHT从第一个参数的右侧返回第二个参数中的任意数量的字符。所以,你想要你的列A的总长度 - 减去索引。因此,它是:

=RIGHT(A2, LEN(A2)-FIND(" ", A2, 1)) 

而且你应该考虑使用TRIM(A2)到处出现......

+1

当有名字,中间名和姓氏时,这不起作用。例如,如果有一个'约翰史蒂文史密斯'我得到的是'史蒂文史密斯' – 2011-05-26 03:32:34

+0

你没有说会有中间名字...... – 2011-05-26 03:45:46

+2

@Jay他没有。但他要求提供“最后一个子字符串” – 2011-05-26 03:48:20

0

试试这个:

=RIGHT(TRIM(A2),LEN(TRIM(A2))-FIND(" ",TRIM(A2))) 

我可以复制/粘贴式和它工作得很好。

下面列出了Excel text functions(2011年5月开始工作,但下次微软更改网站时可能会被打破)。 :-(

如果你期望它们,你可以使用一个多阶段嵌套的IF()函数来处理中间名或首字母,标题等等,Excel公式不支持循环,所以对于什么有一些限制你可以做

+1

像@ Pok的答案,这不会提取最后一个子字符串;相反,它会删除第一个子字符串。当只有名字和姓氏时没有问题,但当有一个或多个中间名时不适用。 – 2011-05-26 07:58:46

4

由@Jean提供的答案提供一个工作但晦涩溶液(虽然它不处理尾部空格)

作为替代考虑VBA用户定义函数(UDF)

Function RightWord(r As Range) As Variant 
    Dim s As String 
    s = Trim(r.Value) 
    RightWord = Mid(s, InStrRev(s, " ") + 1) 
End Function 

使用在片作为
=RightWord(A2)

+7

晦涩,呃?当Excel允许公式中的评论时打电话给我。 – 2011-05-26 08:10:19

+0

@Jean:是的,我希望。这将使维护我自己的代码变得更容易 – 2011-05-26 08:13:18

0
Right(A1, Len(A1)-Find("(asterisk)",Substitute(A1, "(space)","(asterisk)",Len(A1)-Len(Substitute(A1,"(space)", "(no space)"))))) 

尝试此。希望它有效。

-1

试试这个:

Right(RC[-1],Len(RC[-1])-InStrRev(RC[-1]," ")) 
0

在Excel试试这个功能:

Public Shared Function SPLITTEXT(Text As String, SplitAt As String, ReturnZeroBasedIndex As Integer) As String 
     Dim s() As String = Split(Text, SplitAt) 
     If ReturnZeroBasedIndex <= s.Count - 1 Then 
      Return s(ReturnZeroBasedIndex) 
     Else 
      Return "" 
     End If 
    End Function 

你使用这样的:

名(A1)|姓(A2)

值在单元格A1 =迈克尔Zomparelli

我想在列A2的姓氏。

=SPLITTEXT(A1, " ", 1) 

最后一个参数是您想要返回的从零开始的索引。所以如果你在空间char上分割,那么索引0 = Michael和索引1 = Zomparelli

上面的函数是一个.Net函数,但可以很容易地转换为VBA。

1

如果你想获得倒数第二个字的文本,您可以使用此宏作为在电子表格的函数:

Public Function Get2ndText(S As String) As String 

Dim sArr() As String 
Dim i As Integer 
sArr = Split(S, " ") 

'get the next to the last string 
i = UBound(sArr) - 1 
Get2ndText = sArr(i) 

End Function 

然后在你的电子表格1作为文本:

CURRENT OWNER 915 BROADWAY ST HOUSTON TX 77012-2126 

在B2公式是:

=Get2ndText(B1) 

其结果将是

TX 
+0

感谢克里怀特为您的解决方案。为此+1。 – SIM 2018-01-21 21:50:35

相关问题