首先,我想说PeterH的答案是最简单,最容易理解的。(尽管我更喜欢使用FIND()
而不是SEARCH()
少输入两个字符来帮助避免RSI ;-))
既不使用MID()
,LEFT()
也不使用,RIGHT()
而是REPLACE()
用来删除名称中多余部分的替代答案如下:
=REPLACE(REPLACE(A1,FIND(" ",A1)+3,LEN(A1),""),3,FIND(" ",A1)-2,"")
说明:
内部组件REPLACE(A1, FIND(" ",A1)+3, LEN(A1), "")
从姓氏的第三个字符开始删除字符,而外部组件从姓氏的第三个字符开始删除字符,直到空格为止。REPLACE(inner_replace, 3, FIND(" ",A1)-2, "")
附录1:
上面的公式也可以修改为允许使用一个中间名:
=REPLACE(REPLACE(A1,IFERROR(FIND(" ",A1,FIND(" ",A1)+1),FIND(" ",A1))+3,LEN(A1),""),3,IFERROR(FIND(" ",A1,FIND(" ",A1)+1),FIND(" ",A1))-2,"")
通过更换FIND(" ",A1)
用IFERROR(FIND(" ",A1,FIND(" ",A1)+1), FIND(" ",A1))
。
FIND(" ", A1, FIND(" ",A1)+1)
查找第二个空格(通过开始搜索第一个空格之后的空格),否则查找错误。如果没有第二个空格,则查找第一个空格。
IFERROR(find_second_space, FIND(" ",A1))
此版本(长期版本)允许使用任意数量的中间名:
=REPLACE(REPLACE(A1,FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))+3,LEN(A1),""),3,FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))-2,"")
在这种情况下,FIND(" ",A1)
将替换为FIND("§", SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))
。
LEN(A1)-LEN(SUBSTITUTE(A1," ",""))
计算空格数。用替换最后一个空格。找到第一个与找到最后一个空格相同。
SUBSTITUTE(A1, " ", "§", count_of_spaces)
§
FIND("§", last_space_replaced_string)
§
(§
当然,可以用保证在全名字符串中不存在的任何字符替换该字符。更通用,更安全的替代方法是使用CHAR(1)
。)
请注意,当然,BruceWayne的答案是最简单,最容易理解的解决方案,允许使用任意数量的中间名。好吧。在我发布其他答案之前,就是;-)
附录2:
通过将它们包装在一个IFERROR()
函数中,可以将所有解决方案调整为仅满足单个名称的情况(如果需要四个字符的结果):
=IFERROR(solution, alternate_formula)
请注意,以上是一般情况的公式,可能可以对特定解决方案进行更有效的修改。例如,如果在单个名称的情况下要求将前两个字母与后两个字母连接在一起,则可以通过这种方式更有效地调整PeterH的答案:
=LEFT(A1,2)&MID(A1,IFERROR(SEARCH(" ",A1)+1,LEN(A1)-1),2)
为了允许使用单个字母的名字或首字母(假定空格或点不能作为第二个字符),可以在任何解决方案中使用以下内容:
=SUBSTITUTE(SUBSTITUTE(solution, " ", single_char), ".", single_char))
请注意,单个字符可以是硬编码的,也可以根据名称计算得出。(或用于""
删除空格或点。)
最后,如果您确实需要满足全名仅是单个字符(!)的情况,只需将仅单名公式与另一个 包装在一起IFERROR()
。(当然,假设备用公式未处理该特殊情况。)
附录3:
最后,最后(不,真的* ;-))可以满足多个连续和/或前导/尾随空格,请使用TRIM(A1)
代替A1
。
*我将保留一个字母姓氏(例如T先生)的情况,作为读者的练习。
暗示: =solution &IF(MID(A1,LEN(A1)-1,1)=" ", single_char, "")