这个问题是先前问题的一个分支:Excel 公式 - 针对姓氏由多部分组成的人的姓名分隔公式:。
语境
我有一份包含 20,000 多个联系人的列表,其中只有一个“全名”列。我需要为名字和姓氏创建两列。但是,姓名并非都符合这种简单的模式。该列表包括以下姓名:
David Batte
Guy-Mael Jacobe de Naurois
Jean-Marc Lioutier
Thibaud Le Seguillon
Mrs. Manuela Junghaehnel
Hussain Mohammed Dipu Kabir
作为之前问题的答案,我通过剥离符合特定模式的名称集合来解决这个问题,我可以对这些名称应用适当的解析规则。相对较少的模式将允许我自动解析列表中的大部分内容,从而使剩余部分成为更易于管理的任务。
这个问题
全名列表中的很大一部分只包含姓和名,很容易解析。我提出这个问题的目的是找出那些包含两个名字的人,以便将它们与列表中的其他人区分开来。
答案1
有多种方法可以识别列表中的姓名仅包含两个组成部分姓名(如名字和姓氏)的情况。这种情况由分隔组成部分姓名的空格定义。
方法 1
这个问题是之前一个问题的衍生(Excel 公式 - 针对姓氏由多部分组成的人的姓名分隔公式:),其中我们已经在评论中讨论了如何识别单个姓名的情况,例如只有名字或姓氏。如果您已经从列表中删除了这些姓名,因此每个条目都保证至少有两个姓名,您可以在此处使用类似的技术并在此基础上进行构建。
此方法先查找一个空格,然后从那里开始查找另一个空格。如果可以找到第二个空格,则该条目有两个以上的组件名称。如果该条目在 A1 中,则基本公式为:
=FIND(" ",TRIM(A1),FIND(" ",TRIM(A1))+1)
其结果要么是数字(下一个空格的位置),要么是 #VALUE! 错误(如果没有)。#VALUE! 错误很容易发现,并可识别双名称条目。请注意,它还会识别单名称条目,这就是为什么此方法仅在您已删除这些条目时才有效。
您可以通过测试错误条件的结果,然后显示两个名称情况的文本消息或空白,使其更具视觉吸引力。将上面的公式包装在 IF 测试中会得到如下公式:
=IF(ISERROR(FIND(" ",TRIM(A1),FIND(" ",TRIM(A1))+1)),"Just 2","")
方法 2
另一种方法是计算空格数。实际上,您可以使用这种方法来查找任意特定数量的空格,因此只需更改目标计数,您就可以找到单名条目。此方法通过消除所有空格并查看字符串缩短了多少个字符来计算空格数。长度比较会产生空格数。您可以使用 IF 测试将其包装起来,以对结果数字执行所需的操作。标记双名条目(即单个空格)的公式如下所示:
=IF(LEN(TRIM(A1))-LEN(SUBSTITUTE(TRIM(A1)," ",""))=1,"Just 2","")
答案2
我将留下一个更简单的方法可能不是最佳的20000 行。
- 使用数据 -> 文本到列按空格拆分名称
- 姓名将分为 A、B、C 和 D 四列
- 点击过滤器并过滤
blanks
C 列 - 您将只会看到 A 和 B 中显示两个单词名称。将它们复制过去。
- 您可以使用以下方式连接名称
=TEXTJOIN(" ",TRUE,A1:B1)
答案3
我想建议两种可能的方法,第一种是非 VBA,另一种是 VBA。
方法 1:
怎么运行的:
- 在单元格中输入此公式
H2
来创建辅助值(识别姓名的各个部分) 并填写。
=LEN(G2)-LEN(SUBSTITUTE(G2," ",""))
2
在单元格中写入条件H1
。在单元格中输入此数组公式
I2
,最后Ctrl+Shift+Enter并填充。{=IFERROR(INDEX($G$2:$G$14,SMALL(IF(H$1=$H$2:$H$14,ROW($G$2:$G$14)- MIN(ROW($G$2:$G$14))+1,""), ROW()-1)),"")}
注意:
- 通过将单元格中的标准更改
H1
为1
或,3
您可以获得两个或三个以上零件名称的列表。
方法 2:
由于您要处理超过 20000 行,因此 VBA(宏)将是完成该作业的最快方法。
怎么运行的:
- 右键点击工作表标签并从弹出菜单中点击查看代码获取 VB 编辑器。
复制粘贴此代码作为标准模块,最后跑步宏。
Sub DeleteMorethan2() Dim r As Integer, c As Integer, space_count As Integer For r = 2 To 15 space_count = 0 For c = 1 To Len(Range("A" & r)) If Mid(Range("A" & r), c, 1) = " " Then space_count = space_count + 1 If space_count > 1 Then Range("A" & r).ClearContents Next Next End Sub
您将获得以下信息:
注意:
- 该代码正在运行
Rows 2 to 15
,通过编辑此部分For r = 2 To 15
,您可以包含更多行。 - 使用的列是
A
,它也是可编辑的。
此外,我建议使用数组公式通过删除空行来重新创建名称列表。
在单元格中输入此数组公式
B2
,最后Ctrl+Shift+Enter并填写。{=IFERROR(INDEX(A$2:A$14,SMALL(IF(A$2:A$14<>"",ROW(A$2:A$14)-ROW(A$2)+1),ROWS(B$2:B2))),"")}
根据需要调整公式中的单元格引用。