【问题标题】:excel formula help to split complex namesexcel公式有助于拆分复杂名称
【发布时间】:2026-02-02 05:30:01
【问题描述】:

我的任务是进行一些字符串操作,今天一定是我头疼的一天,因为事实证明它比我预期的要困难。

我必须从第一列、第二列和第三列以及任何姓氏中取第一个、第二个和第三个名字的首字母

另外,我们需要保留标题。

下面是一个长名称的例子:

C Chrysostomou 先生和 N Chrysostomou 先生和 A Chrysostomou 夫人

M Karseras 夫人和 P Hadjisoteriou 女士和 E Athanasiou 夫人

A Theodorou 夫人、A Aristotelou 先生、G Naziri 夫人和 M Karmiou L Vazanias 夫人和 G 夫人

布雷斯韦特和海伦·韦斯特夫人 L Vazanias 夫人和 G 布雷斯韦特夫人和夫人

Helen West Olympia Pieridou 夫人和 T&mr M 夫人、C 先生和 K 夫人

Michaelides J A Santamas 小姐和 M T Santama 夫人- Solomonides 和 Lida 夫人

圣诞老人 J A Santamas 小姐和 M T Santama- Solomonides 夫人和 Lida 夫人

圣诞老人 Polydoros Polydorou 先生和 Maro Themistocleous 夫人和 Sylvia 夫人

Polydorou Themis 先生和 Androulla 夫人 & Nicholas 先生和 Vasso Gina 夫人

Demetriou SK Makkofaides 夫人、Z Koullas 先生、Y Koullas 夫人和 R 夫人

Kleopa G Zorzy 先生和 H Louca Zorzy 夫人 & S Stavropoulos 先生和 Y 夫人

Stavropoulos Mrs M Franceschina & Ms C Eugeniou & Ms O L Toumazides

T/a The Three Cupcakes Mr David & Mrs Eileen Nixon D.h.nixon & Co. - 办公室帐户

如您所见,这些可以被视为 2 人甚至 3 人之间的联名银行账户。我们必须保留名字,可以是Mr、Miss、Ms、Dr、DoctorMessrs以及名字和名字的首字母以及完整的名字姓氏,总长度应少于 35 个字符!

所以,这是我在网上搜索后一直在尝试的:

=IF(LEN(TRIM(E:E))-LEN(SUBSTITUTE(TRIM(E:E)," ",""))>=1,MID(TRIM(E:E),FIND(" ",TRIM(E:E))+1,1),"")& " " &IF(LEN(TRIM(E:E))-LEN(SUBSTITUTE(TRIM(E:E)," ",""))>=2,MID(SUBSTITUTE(TRIM(E:E)," ","",1),FIND(" ",SUBSTITUTE(TRIM(E:E)," ","",1))+1,1),"")

获取首字母,但只有前 2 个

=RIGHT(J:J,LEN(J:J)-FIND(" ",J:J)+1)

获取姓氏但无法正常工作。

我是想多了还是想多了?

我最好的数据处理方法是什么?

谢谢 菲利普

【问题讨论】:

  • 第一步是使用& 上的文本到列作为分隔符进行拆分?
  • 是的,我已经这样做/尝试过了,但我仍然对拆分所有首字母和姓氏感到困惑
  • 您认为我最好在 VBA 中执行此操作,而不是使用严重的嵌套公式吗?
  • 您可以在 VBA 中执行此操作,但如果这是一次性的,那么您可以手动执行部分 + 部分公式。一旦你使用了文本到列,只需使用查找和替换所有MrMrs 等,然后最后使用公式根据空格分割名称?只是一个想法......
  • 或者写一个VBA代码来完成以上所有操作?

标签: excel excel-formula tokenize string-split


【解决方案1】:

这应该让你开始。

假设您的数据如下所示

将此代码粘贴到模块中。 (注意:此代码未经广泛测试,但传达了信息)

Option Explicit

Sub Sample()
    Dim MyAr As Variant
    Dim FinalAr() As String, TmpAr() As String
    Dim ws As Worksheet
    Dim lrow As Long, i As Long, n As Long, j As Long

    '~~> Set this to the relevant sheet
    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        '~~> get last row of col A
        lrow = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> Store the values in an array
        MyAr = .Range("A1:A" & lrow)

        '~~> Loop through the array and split it on "&" and store it in another array
        For i = LBound(MyAr) To UBound(MyAr)
            If InStr(1, MyAr(i, 1), "&") Then
                TmpAr = Split(MyAr(i, 1), "&")

                For j = LBound(TmpAr) To UBound(TmpAr)
                    n = n + 1
                    ReDim Preserve FinalAr(n)
                    FinalAr(n) = Trim(TmpAr(j))
                Next j
            Else
                n = n + 1
                ReDim Preserve FinalAr(n)
                FinalAr(n) = Trim(MyAr(i, 1))
            End If
        Next i

        '~~> Past the outcome in Col B
        .Range("B1").Resize(UBound(FinalAr) + 1, 1).Value = Application.Transpose(FinalAr)

        '~~> Replace all mrs/mr etc
        .Columns(2).Replace What:="MRS", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

        .Columns(2).Replace What:="MR", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

        .Columns(2).Replace What:="MISS", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

        '~~> Find Last Row of Col B
        lrow = .Range("B" & .Rows.Count).End(xlUp).Row

        '~~> Loop through col B and split the names
        For i = 2 To lrow
            If InStr(1, .Range("B" & i), " ") Then
                TmpAr = Split(Trim(.Range("B" & i)), " ")

                n = 1

                For j = LBound(TmpAr) To UBound(TmpAr)
                    .Range("B" & i).Offset(, n).Value = TmpAr(j)
                    n = n + 1
                Next
            Else
                .Range("C" & i).Value = .Range("B" & i).Value
            End If
        Next i
    End With
End Sub

结果(截图)

【讨论】:

  • @Philip:离开 2 小时,因此如果您有任何问题,将无法回复,但请随时发布。等我回来看看。
  • 这绝对是正确的方法,先用 & 分割,然后再用 空格 ... 将继续努力,谢谢!