Excel公式:查找一单元格中某字符最后出现位置

本文介绍在Excel中如何从右向左查找字符出现的首个位置或从左向右查找字符出现的最后位置,包括多种公式实现方法,如直线思路公式、行扩展拆分字符公式、列扩展拆分字符公式等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个需求简单来说,就是从右向左查找字符出现的首个位置,或从左向右查找字符出现的最后位置,例如:
查找“普通人民代表大会发言人任免人选”中,最后一个“人”字的位置,直接的查找是做不到的。
以下是各种公式:(以查找A1单元格中最后一个“@”为例)

1.直线思路公式:
=FIND("☆",SUBSTITUTE(A1, "@", "☆", LEN(A1)-LEN(SUBSTITUTE(A1, "@", ""))))
解释:先通过替换删除法算出原字符串中有多少个“@”,例如n个,然后将第n个“@”替换成“☆”再查找“☆”的位置。

2.行扩展拆分字符公式:
=LOOKUP(1,0/(MID(A1,COLUMN(1:1),1)="@"),COLUMN(1:1))
解释:column(1:1)会自动扩展成第一行的有限列数组(2003版上限256列,2010版上限16384列),然后公式就成了对A1的内容按每个字符拆分成数组,然后比对是否是“@”,是的话会返回逻辑值“True”,用零除运算后,“True”的项会变成“0”,其他变成“#DIV/0”,而对这些项组成的数组查找“1”将等同于查找最后一个“0”,然后给出对应的行号(位置)数字。缺点就是2003版的话字符长度限制大。

3.列扩展拆分字符公式:
=LOOKUP(1,0/(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)="@"),ROW(INDIRECT("1:"&LEN(A1))))
解释:原理同上,只是将行变成列,而且是限制行数为A1内容长度,而行数上限比列数上限大多了。
同样原理还有两种公式:
=LOOKUP(LEN(A1),FIND("@",A1,ROW(INDIRECT("1:"&LEN(A1)))))
原理同上,只是拆分数组的方式是从第n个字符开始查找“@”(小于n的位置值就被忽略),找到就返回位置值,然后对这些位置值组成的数组查找最接近A1内容长度的值,返回。
类似公式,不过需要Ctrl-Shift-Enter三键输入:
=MATCH(LEN(A1),FIND("@",A1,ROW(INDIRECT("1:"&LEN(A1)))))
=MATCH(1,0/(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)="@"))


4.还是列扩展拆分字符公式,需要Ctrl-Shift-Enter三键输入:
=MAX(IF(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)="@",ROW(INDIRECT("1:"&LEN(A1)))))
解释:原理还是同上,不同的是使用了max()。从上面两节的解释可以看到,其实要找也是找最大的位置值,所以可能大多数人一想就会想用Max(),但为什么不行呢——因为max()需要对比数值大小,从而不接受错误值,而lookup()、match()则只是字符匹配,可以略过错误值。为了使用max(),就要用if()来排除错误值项,公式就长了。
要避开使用if(),那么可以使用类似sumproduct()风格的条件式(注意中间的 * 号),需要Ctrl-Shift-Enter三键输入:
=MAX((MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)="@")*ROW(INDIRECT("1:"&LEN(A1))))

5.极致最短公式:
=-LOOKUP(,-FIND("@",A1,ROW(A:A)))
解释:依然是列拆分字符公式,但是行数限制省去了,然后将查找到的位置值取相反数,使位置值全变【从大到小】的负数(强调一下,其绝对值就是【从小到大】),再从中查找最后一个位置值(略过错误值),再取一次相反数获得原来的位置值。
这里要解释一下,为什么相反数了还是查找最后一个位置值?
原理是这样的,lookup()是假定查找的序列(数组或向量)是升序排列的(不像vlookup和match那样可指定假定降序或假定乱序/精确查找),并在这样的假定下进行二分法查找(详情请看【深入理解LOOKUP:LOOKUP函数的查找原理】,返回小于等于目标值的项。因此,lookup()相当于是假定查找序列最大的值在最后,如果找不到和目标值相同的值,那么其返回的就是最后一个非错误值。

6.另类思路公式,需要Ctrl-Shift-Enter三键输入:
=TEXT(LEN(A1)-MATCH("@",LEFT(RIGHT("@"&A1,ROW($1:$99))),)+1,"[>];")

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值