如何在Excel中进行反向字符串搜索而不使用VBA?

190

我有一个包含字符串列表的 Excel 电子表格,每个字符串由多个单词组成,但每个字符串中单词数量不同。

是否有一种方法可以在不使用 VBA 的情况下利用内置的 Excel 函数来分离每个字符串中的最后一个单词?

示例:

  Are you classified as human? -> human?
Negative, I am a meat popsicle -> popsicle
                  Aziz! Light! -> Light!

4
我想知道为什么您设置了无法使用VBA的人工限制? - EBGreen
3
我可以用VBA轻松解决它,但我想知道是否有非VBA的解决方案。对于大数据集,VBA往往会带来性能损失。 - e.James
很棒的问题。非常优秀的答案。非常优雅。 - Mike Parks
1
我想说的是,使用公式而不是VBA的原因是因为你可以保持 .xslx 格式。一旦你编写了一行VBA代码,你就变成了一个.xlsm文件,并且可能会对任何COM端口、注册表进行写入操作,打开应用程序等等——VBA已经整合到Windows中,可以被任何病毒检测器、电子邮件客户端或尝试打开它的应用程序所使用。因此,留在“电子表格领域”对于普通的“安全意识用户”来说增加了很多价值。这就是为什么Lambda函数如此强大,它们让你更接近VBA,而不会使你的文档成为安全威胁。 - Mike Parks
1
通过函数,您只是以“优雅”的方式处理了数据 - 但是使用VBA,您可以收获“旋风”或创造“天堂”。选择哪一个:取决于您。有时,“保持简单”是最优雅的解决方案。 - Mike Parks
显示剩余6条评论
16个回答

1
=LEFT(A1,FIND(IF(
 ISERROR(
  FIND("_",A1)
 ),A1,RIGHT(A1,
  LEN(A1)-FIND("~",
   SUBSTITUTE(A1,"_","~",
    LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
   )
  )
 )
),A1,1)-2)

1

想象一下字符串可以被反转。那么这就非常容易了。不要对字符串进行操作:

"My little cat" (1)

你正在处理

"tac elttil yM" (2)

使用 =LEFT(A1;FIND(" ";A1)-1) 在 A2 中,你可以得到 (1) 中的 "My" 和 (2) 中的 "tac",它是反转的 "cat",也就是 (1) 中的最后一个单词。

有一些 VBA 可以用来反转字符串。我更喜欢公共 VBA 函数 ReverseString

按照上述说明安装上面的函数。然后在 A1 中输入你的字符串,例如 "My little cat",并在 A2 中使用此函数:

=ReverseString(LEFT(ReverseString(A1);IF(ISERROR(FIND(" ";A1));
  LEN(A1);(FIND(" ";ReverseString(A1))-1))))

在A2中你会看到"cat"

上面的方法假设单词之间用空格分隔。如果单元格中没有空格,则 IF 语句适用于包含单个单词的单元格。注意: TRIMCLEAN 的原始字符串也很有用。原则上,它将从 A1 中反转整个字符串,然后简单地查找反转后的最后一个单词旁边的第一个空格(即"tac ")。 LEFT选取这个单词,另一个字符串的反转重组成了单词的原始顺序 (" cat")。FIND语句末尾的-1去除了空格。

这个想法是容易用LEFT和查找第一个空格来提取字符串中的第一个单词。然而对于最后一个单词,当你尝试这样做时,RIGHT函数是错误的选择,因为不幸的是,FIND没有标志表示您要分析字符串的方向。

因此,整个字符串被简单地颠倒。 LEFTFIND 的工作方式与正常相同,但提取的字符串被颠倒。但一旦你知道如何颠倒一个字符串,这就没什么大不了的了。公式中的第一个 ReverseString 语句就是完成这个工作的。

这比这里所有其他选项都简单得多,非常感谢!为什么Find不能有一个反向查找或替换 - 我记得与使用负数进行反向搜索有关,但显然不是vba.... - Craig Lambie
4
OP要求不使用VBA。 - Tripp Kinetics
这也太疯狂了吧!如果你要使用VBA,你同样可以轻松地进行反向查找。 - Denzil Newman

0

另一种实现方式如下所示

=IF(ISERROR(TRIM(MID(TRIM(D14),SEARCH("|",SUBSTITUTE(TRIM(D14)," ","|",LEN(TRIM(D14))-LEN(SUBSTITUTE(TRIM(D14)," ","")))),LEN(TRIM(D14))))),TRIM(D14),TRIM(MID(TRIM(D14),SEARCH("|",SUBSTITUTE(TRIM(D14)," ","|",LEN(TRIM(D14))-LEN(SUBSTITUTE(TRIM(D14)," ","")))),LEN(TRIM(D14)))))

enter image description here


0

我也翻译成了PT-BR,因为我也需要。

(请注意,我已将空格更改为 \, 因为我只需要路径字符串的文件名。)

=SE(ÉERRO(PROCURAR("\",A1)),A1,DIREITA(A1,NÚM.CARACT(A1)-PROCURAR("|", SUBSTITUIR(A1,"\","|",NÚM.CARACT(A1)-NÚM.CARACT(SUBSTITUIR(A1,"\",""))))))

3
我不知道如何读取葡萄牙语的Excel,所以我只能相信你的话 :) - e.James

0

您也可以通过反转字符串并找到第一个空格来实现此目的

=MID(C3,2+LEN(C3)-SEARCH(" ",CONCAT(MID(C3,SEQUENCE(LEN(C3),,LEN(C3),-1),1))),LEN(A1))

  1. 反转字符串

CONCAT(MID(C3,SEQUENCE(LEN(C3),,LEN(C3),-1),1))

  1. 在反转后的字符串中找到第一个空格

SEARCH(" ",...

  1. 将在反转后的字符串中找到的空格位置从字符串长度中减去,并返回该部分

=MID(C3,2+LEN(C3)-SEARCH...


-1

我也有过这样的任务,当我完成后,使用上述方法,我想到了一个新方法:为什么不这样做:

  1. 反转字符串(“string one”变成“eno gnirts”)。
  2. 使用老式的查找(硬编码为从左到右)。
  3. 再次将其反转为可读字符串。

这听起来怎么样?


13
当然。但是你如何在Excel中反转字符串? - e.James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接