Excel 拆分前缀和姓氏(基于数组数据)

Excel 拆分前缀和姓氏(基于数组数据),excel,excel-formula,vba,Excel,Excel Formula,Vba,我有一列名外数据,可能包含姓氏前缀,也可能不包含姓氏前缀。这些前缀可以存在于多个单词中。我有一个所有可能前缀的列表,但现在我需要拆分前缀和姓氏,并用数据创建两列 我所做的是编写一个excel公式,如下所示: =IF( RIGHT(A1;7) = " van de" ; RIGHT(A1;6) ; IF( RIGHT(A1;4) = " van" ; RIGHT(A1;3) ; IF( RIGHT(A1;3) = " d

我有一列名外数据,可能包含姓氏前缀,也可能不包含姓氏前缀。这些前缀可以存在于多个单词中。我有一个所有可能前缀的列表,但现在我需要拆分前缀和姓氏,并用数据创建两列

我所做的是编写一个excel公式,如下所示:

=IF(
   RIGHT(A1;7) = " van de"
 ;
   RIGHT(A1;6)
 ;
   IF(
     RIGHT(A1;4) = " van"
   ;
     RIGHT(A1;3)
   ;
     IF(
       RIGHT(A1;3) = " de"
     ;
       RIGHT(A1;2)
     ;
       --Insert more nested If statements here--
     )
   )
 )
Name1 van de
Name1 van
Name1
Name1 Name2 van
Name1-Name2 Name3 van de
Name1 Name2 Name3
姓氏数据如下所示:

=IF(
   RIGHT(A1;7) = " van de"
 ;
   RIGHT(A1;6)
 ;
   IF(
     RIGHT(A1;4) = " van"
   ;
     RIGHT(A1;3)
   ;
     IF(
       RIGHT(A1;3) = " de"
     ;
       RIGHT(A1;2)
     ;
       --Insert more nested If statements here--
     )
   )
 )
Name1 van de
Name1 van
Name1
Name1 Name2 van
Name1-Name2 Name3 van de
Name1 Name2 Name3
我想要的是:

  OriginalName   |  Name  |  Prefix
-----------------|--------|----------
      a b        |   a    |    b
      a b c      |   a    |    b c
首先,这是一个非常低效的方法,但我自动创建了这个公式,所以这不再是一个问题。现在我发现嵌套的If语句有一个限制,我必须超过这个限制

我应该如何解决这个问题

我有一个带有可能前缀的数组。也许这会有帮助?

把你的姓氏从最长的到最短的排序。我把我的放在E1:E3

然后使用以下数组公式:

=TRIM(IFERROR(SUBSTITUTE(A1,INDEX($E$1:$E$3,MATCH(TRUE,ISNUMBER(SEARCH($E$1:$E$3,A1)),0)),""),A1))
那么要知道姓氏:

=IFERROR(INDEX($E$1:$E$3,MATCH(TRUE,ISNUMBER(SEARCH($E$1:$E$3,A1)),0)),"")
作为一个数组公式,在退出编辑模式时,需要使用Ctrl-Shift-Enter而不是Enter确认这些公式。如果操作正确,Excel将在公式周围放置
{}


我假设您希望将“van”和“de”前缀与名称的其余部分分开。如果我误解了,请提供更多您的问题的例子

以下解决方案需要一个helper列来确定“前缀”的起始位置,但如有必要,可以将其隐藏:

首先,将我的值放在
A8:A9
(van;de)的任意位置,并将其命名为
前缀
,以便在以下公式中引用

C1
中的公式是一个数组公式(使用Ctrl+Shift+Enter):

D1
E1
中的公式或普通公式:

=IF(C1>0,LEFT(A1,C1-2),A1)
=IF(C1>0,MID(A1,C1,LEN(A1)),"")

我知道这个问题已经得到了回答,但我昨天做了,没有时间提交(不得不赶公交车)

所有前缀值前面都有一个空格

B列公式(数组公式-Ctrl+Shift+Enter进入公式栏)
=索引(替换(A1,前缀“”),匹配(小(LEN(替换(A1,前缀“”),1),LEN(替换(A1,前缀“”),0))


列C公式-
=TRIM(替换为(A1,B1,”)

将所有前缀存储在一个数组(或一个范围)中,使用需要操作的字符串在所述范围内循环,并在数组中循环,并执行类似“if cell=array(i),则执行soemthing”的检查。您是在单元格内还是在宏中执行此操作?前缀和名称的其余部分之间是否始终存在空格字符?名字的“正文”总是一个单词吗?@DougCoats这意味着对于每个名字(大约9000个),它必须检查20个前缀中是否有一个,对吗?这不是很费时吗?@Werrf现在我正试图用细胞内的一个公式来做这件事。当有前缀时,总有一个空格。名称的正文可以是多个单词。@Grafit我敢打赌不会花那么长时间。Vba相当快,尤其是在阵列中工作时。我愿意打赌它需要4到5秒(如果在vba中完成,而不是工作表的事情)。这个公式是一个很大的帮助!这肯定是朝着正确的方向发展。现在,我只希望前缀在不同的列中。我可以用这样的公式来实现这一点吗?当然,只需将
INDEX()
函数部分放在另一列中,并使用Ctrl-Shift-enter键输入,因为它会将姓氏返回给替换函数。此外,在该网站上,在获得答案后使用新请求更改问题是不合适的,因为它会使答案无效,并将其打开以进行向下投票。请把你的问题放回原处。如果我上面的评论没有回答你的第二个请求,请提出一个新问题@GrafitI尝试将
INDEX()
部分的引用更改为具有我使用原始解决方案创建的结果的列。对于前缀来说效果很好,但是第4行现在返回
craner
。我没有一个只提供所有姓氏的专栏。下次请确保您的所有要求都在一开始就存在@格拉菲特的作品相当不错。不过有一个问题。当某人的名字是
Name1 Demas Name3
时,公式认为
Demas Name3
是前缀。有没有办法确保它不会混淆这一点?在
前缀
数组中的
de
值的末尾加一个空格。然后将数组公式更改为
=MIN(如果(ISNUMBER(SEARCH(prefix,A2&“”)),SEARCH(prefix,A2&“”))
。。。哦还可以将
搜索
功能切换为
查找
功能,以进行区分大小写的搜索。。。好吧,那只会有点帮助。。。