提问人:Jack 提问时间:6/6/2023 更新时间:6/7/2023 访问量:182
从一个单元格中提取多个名字、姓氏和中间名
Extract multiple first names, surnames and middle names from one cell
问:
我在单元格 O9:O75 中有一串文本,格式为 姓氏,名字中间名:姓氏,名字中间名:姓氏,名字中间名:等等
例如 莫林,塞巴斯蒂安:戈特瓦尔德,卢卡斯:马拉杰,奥尼卡·坦尼娅:奥格伦,瑞安:瓦尔德斯,罗科:佩特拉斯,金:卡尔伯格,艾尔克
我需要.. 名字中间名;名字中间名;名字中间名;名字中间名;等 在单元格 X9:X75 中
以及 姓;姓;姓;姓;等 在细胞 Y9:Y75 中
文本字符串可以有 1 个名称,也可以有任意数量的名称,最多可以有 20 个左右。
提前非常感谢
我尝试使用 VBA 左、右和中间字符串函数,但没有成功。
答:
3赞
FunThomas
6/6/2023
#1
这基本上是一个小位字符串处理,函数 Split
是关键。你只需要知道它返回一个 0 索引的字符串数组。
因此,首先将字符串拆分以获得所有人员的列表。现在循环遍历人称并将该名称拆分,以将姓氏与名字(和可选中间名)分开。":"
","
使用您选择的分隔符将这些名称粘合在一起。
以下函数可以用作 UDF:
Function getNames(S As String, getSurnames As Boolean) As String
Const NameSeparator = ":"
Const SurnameSeparator = ","
Const ResultSeparator = ";"
Dim allPersons() As String
' First we create an array with one entry per person
allPersons = Split(S, NameSeparator)
' Decide if we want to have first or second piece of the name
Dim namePartIndex As Long
namePartIndex = IIf(getSurnames, 0, 1)
Dim i As Long
For i = 0 To UBound(allPersons)
' Split the name of a person.
Dim nameparts() As String
nameparts() = Split(allPersons(i), SurnameSeparator)
If UBound(nameparts) >= namePartIndex Then
getNames = getNames & IIf(getNames = "", "", ResultSeparator) & Trim(nameparts(namePartIndex))
End If
Next
End Function
现在,您所要做的就是将公式放入 X 列和 Y 列中:
=getNames(O5, getSurnames:=False) ' For Firstnames (and Middle Names)
=getNames(O5, getSurnames:=True) ' For Surnames
更新:很抱歉造成混淆,从 Excel 调用函数时不允许使用命名参数。这应该是
=getNames(O5, False) ' For Firstnames (and Middle Names)
=getNames(O5, True) ' For Surnames
评论
0赞
Jack
6/7/2023
非常感谢您的回复,不幸的是我无法让它工作,当输入建议的公式时,它会返回错误并将光标放在“=getNames(O5, getSurnames:”)之后,任何进一步的建议都非常感谢。
0赞
FunThomas
6/7/2023
对不起,将我的测试复制到函数中时犯了一个错误。查看我的更新。
0赞
Jack
6/7/2023
太棒了,工作完美,非常感谢
评论
拆分
功能两次:先开,后开:
,