从一个单元格中提取多个名字、姓氏和中间名

Extract multiple first names, surnames and middle names from one cell

提问人:Jack 提问时间:6/6/2023 更新时间:6/7/2023 访问量:182

问:

我在单元格 O9:O75 中有一串文本,格式为 姓氏,名字中间名:姓氏,名字中间名:姓氏,名字中间名:等等

例如 莫林,塞巴斯蒂安:戈特瓦尔德,卢卡斯:马拉杰,奥尼卡·坦尼娅:奥格伦,瑞安:瓦尔德斯,罗科:佩特拉斯,金:卡尔伯格,艾尔克

我需要.. 名字中间名;名字中间名;名字中间名;名字中间名;等 在单元格 X9:X75 中

以及 姓;姓;姓;姓;等 在细胞 Y9:Y75 中

文本字符串可以有 1 个名称,也可以有任意数量的名称,最多可以有 20 个左右。

提前非常感谢

我尝试使用 VBA 左、右和中间字符串函数,但没有成功。

Excel VBA 字符串 拆分 切片

评论

5赞 BigBen 6/6/2023
使用拆分功能两次:先开,后开:,

答:

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
太棒了,工作完美,非常感谢