是否有一种有效的方法来识别字符串中使用基函数的最后一个字符/字符串匹配?也就是说,不是字符串的最后一个字符/字符串,而是字符/字符串在字符串中最后出现的位置。搜索和查找都从左到右工作,所以我不知道如何应用没有冗长的递归算法。现在看来,这种解决方案已经过时了。
当前回答
刚想出这个解决方案,不需要VBA;
找到我的例子中最后出现的“_”;
=IFERROR(FIND(CHAR(1);SUBSTITUTE(A1;"_";CHAR(1);LEN(A1)-LEN(SUBSTITUTE(A1;"_";"")));0)
由内而外解释;
SUBSTITUTE(A1;"_";"") => replace "_" by spaces
LEN( *above* ) => count the chars
LEN(A1)- *above* => indicates amount of chars replaced (= occurrences of "_")
SUBSTITUTE(A1;"_";CHAR(1); *above* ) => replace the Nth occurence of "_" by CHAR(1) (Nth = amount of chars replaced = the last one)
FIND(CHAR(1); *above* ) => Find the CHAR(1), being the last (replaced) occurance of "_" in our case
IFERROR( *above* ;"0") => in case no chars were found, return "0"
希望这对你有帮助。
其他回答
如果您只查找字符“~”的最后一个实例的位置,那么 = len(替代(字符串 ,"~",""))+ 1
我确信有一个版本将与字符串的最后一个实例一起工作,但我必须回去工作。
我想我明白你的意思了。假设你想要下面字符串中最右边的\(存储在A1单元格中):
驱动器:\ \子文件夹Filename文件夹。请拨分机
为了得到最后一个\的位置,你可以使用这个公式:
=FIND("@",SUBSTITUTE(A1,"\","@",(LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))/LEN("\")))
这告诉我们最右边的\在第24个字符。它通过查找“@”并将最后一个“\”替换为“@”来实现这一点。它通过使用来确定最后一个
(len(string)-len(substitute(string, substring, "")))\len(substring)
在这种情况下,子字符串就是长度为1的“\”,所以你可以在结尾省去除法,只使用:
=FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))
现在我们可以使用它来获取文件夹路径:
=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))))
下面是没有结尾\的文件夹路径
=LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))-1)
要获得文件名:
=MID(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))
但是,这里有一个替代版本,可以使所有内容都位于特定字符的最后一个实例的右侧。所以使用我们同样的例子,这也会返回文件名:
=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))
我来晚了一点,但也许这个能帮上忙。问题中的链接使用了类似的公式,但我的链接使用IF()语句来消除错误。
如果你不怕Ctrl+Shift+Enter,你可以很好地使用数组公式。
字符串(在单元格A1中): “one.two.three.four”
公式:
{=MAX(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)))} use Ctrl+Shift+Enter
结果:14
首先,
ROW($1:$99)
返回1到99的整数数组:{1,2,3,4,…,98,99}。
接下来,
MID(A1,ROW($1:$99),1)
返回一个在目标字符串中找到的长度为1的字符串数组,然后在达到目标字符串的长度后返回空白字符串:{"o","n","e",".",…"u","r","","",""…}
接下来,
IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99))
将数组中的每个项与字符串"."进行比较,并返回字符串中字符的索引或FALSE: {FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE, FALSE,14,FALSE,FALSE.....}
最后的
=MAX(IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99)))
返回数组的最大值:14
这个公式的优点是简短,相对容易理解,并且不需要任何唯一的字符。
缺点是需要使用Ctrl+Shift+Enter和字符串长度的限制。这可以通过如下所示的变化来解决,但该变化使用OFFSET()函数,这是一个volatile(读取:slow)函数。
不知道这个公式的速度是多少。
变化:
=MAX((MID(A1,ROW(OFFSET($A$1,,,LEN(A1))),1)=".")*ROW(OFFSET($A$1,,,LEN(A1)))) works the same way, but you don't have to worry about the length of the string
=SMALL(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd occurrence of the match
=LARGE(IF(MID(A1,ROW($1:$99),1)=".",ROW($1:$99)),2) determines the 2nd-to-last occurrence of the match
=MAX(IF(MID(I16,ROW($1:$99),2)=".t",ROW($1:$99))) matches a 2-character string **Make sure you change the last argument of the MID() function to the number of characters in the string you wish to match!
在新版本的Excel(2013年及以上)中,闪光填充可能是一个简单而快速的解决方案:在Excel中使用闪光填充 .
如何创建一个自定义函数并在您的公式中使用它?VBA有一个内置的函数,InStrRev,它所做的正是您正在寻找的。
把这个放到一个新模块中:
Function RSearch(str As String, find As String)
RSearch = InStrRev(str, find)
End Function
你的函数看起来像这样(假设原始字符串在B1中):
=LEFT(B1,RSearch(B1,"\"))
推荐文章
- Excel:匹配字符串中的最后一个字符/字符串
- .text, .value和.value2之间的区别是什么?
- 从c#读取Excel文件
- 检查单元格是否包含子字符串
- 在Excel中从公式返回空单元格
- 熊猫:在excel文件中查找表格列表
- 循环通过文件夹中的文件使用VBA?
- 将公式应用到Excel中的整个列的快捷方式
- 在现有Excel值中添加前导0 /0到一定长度
- 如何从一个VBA函数返回一个结果
- 如何在Excel中创建包含双引号的字符串或公式?
- 使用Pandas对同一工作簿的多个工作表进行pd.read_excel()
- 在Linux中用命令行将xlsx转换为csv
- 设置excel文档的mime类型
- excel文件的正确内容类型是什么?