Excel:string中的最后一个字符/string匹配

有没有一种有效的方法来识别使用基函数的string中的最后一个字符/string匹配? 即不是string的最后一个字符/string,而是string/string在string中最后一次出现的位置。 Searchfind这两个工作从左到右,所以我想不出如何申请没有冗长的recursionalgorithm。 现在这个解决scheme似乎已经过时了。

我想我明白你的意思。 比方说,例如你想在下面的string(它存储在单元格A1中)中的最右边\:

驱动器:\文件夹\子文件夹\ FILENAME.EXT

为了得到最后一个\的位置,你可以使用这个公式:

 =FIND("@",SUBSTITUTE(A1,"\","@",(LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))/LEN("\"))) 

这告诉我们最右边的\是在字符24处。它通过查找“@”并用“@”代替最后的“\”来做到这一点。 它通过使用确定最后一个

 (len(string)-len(substitute(string, substring, "")))\len(substring) 

在这种情况下,子string简单地是“\”,长度为1,所以你可以在最后离开分区,只使用:

 =FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))) 

现在我们可以使用它来获取文件夹path:

 =LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))) 

这里的文件夹path没有尾随\

 =LEFT(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))-1) 

而只得到文件名:

 =MID(A1,FIND("@",SUBSTITUTE(A1,"\","@",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1)) 

但是,这里是一个替代版本,让一切都在特定angular色的最后一个实例的右侧。 所以使用我们的相同的例子,这也将返回文件名:

 =TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1))) 

如何创build一个自定义函数,并在你的公式中使用它? VBA有一个内置函数InStrRev ,它完全符合你的要求。

把它放在一个新的模块中:

 Function RSearch(str As String, find As String) RSearch = InStrRev(str, find) End Function 

你的函数看起来像这样(假设原始string在B1中):

 =LEFT(B1,RSearch(B1,"\")) 

刚刚提出这个解决scheme,不需要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" 

希望这是有帮助的。

你可以使用我创build的这个函数来查找string中最后一个string的实例。

确定接受的Excel公式是有效的,但是阅读和使用太困难了。 在某些时候,你必须分解成更小的块,这样才能维护。 我的下面的函数是可读的,但这是不相关的,因为你使用命名参数在公式中调用它。 这使得使用它很简单。

 Public Function FindLastCharOccurence(fromText As String, searchChar As String) As Integer Dim lastOccur As Integer lastOccur = -1 Dim i As Integer i = 0 For i = Len(fromText) To 1 Step -1 If Mid(fromText, i, 1) = searchChar Then lastOccur = i Exit For End If Next i FindLastCharOccurence = lastOccur End Function 

我这样使用它:

 =RIGHT(A2, LEN(A2) - FindLastCharOccurence(A2, "\")) 

tigeravatar和Jean-FrançoisCorbettbuild议使用此公式来生成最后一次出现“\”字符的string右侧

 =TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1))) 

如果用作分隔符的字符是空格,那么公式必须更改为:

 =SUBSTITUTE(RIGHT(SUBSTITUTE(A1," ",REPT("{",LEN(A1))),LEN(A1))),"{","") 

不必提及,“{”字符可以replace为任何不会“正常”出现在文本中的字符进行处理。

考虑到由@SSilk所做的评论的一部分, 我的最终目标确实是让所有事情都发生最后一次发生事情上 ,一个非常简单的公式的替代方法是复制string的列( A )和副本说ColumnB)应用查找和replace。 举个例子: Drive:\Folder\SubFolder\Filename.ext

找什么

这将返回在任何字符的最后一个实例(这里是\ )后面剩下的(这里是Filename.ext ),这有时是目标,并且有利于通过一个简短公式find最后一个这样的字符的位置,例如:

 =FIND(B1,A1)-1 

在VBA中这样做的一个简单方法是:

 YourText = "c:\excel\text.txt" xString = Mid(YourText, 2 + Len(YourText) - InStr(StrReverse(YourText), "\" )) 

我对晚会有点迟,但也许这可能有帮助。 问题中的链接有一个类似的公式,但我使用IF()语句来摆脱错误。

如果你不怕Ctrl + Shift + Enter,你可以用数组公式做得很好。

string(在单元格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) 

返回在目标string中find的长度为1的string数组,然后在到达目标string长度后返回空string: {"o","n","e",".",..."u","r","","",""...}

下一个,

 IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99)) 

将数组中的每个项目与string“。”进行比较。 并返回string中的字符索引或FALSE: {FALSE,FALSE,FALSE,4,FALSE,FALSE,FALSE,8,FALSE,FALSE,FALSE,FALSE,FALSE,14,FALSE,FALSE.....}

持续,

 =MAX(IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99))) 

返回数组的最大值: 14

这个公式的优点是它简短,相对容易理解,并且不需要任何独特的字符。

缺点是需要使用Ctrl + Shift + Enter和string长度限制。 这可以通过下面显示的变化来解决,但是这个变体使用了一个volatile(read:slow)函数的OFFSET()函数。

不知道这个公式的速度是多less。

变化:

 =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! 

晚会很晚,但一个简单的解决scheme是使用VBA来创build自定义function。

将函数添加到WorkBook,Worksheet或VBA模块中的VBA

 Function LastSegment(S, C) LastSegment = Right(S, Len(S) - InStrRev(S, C)) End Function 

然后细胞公式

 =lastsegment(B1,"/") 

在一个单元格中,要在单元格B1中search的string将填充单元格B1中最后一个“/”的文本。 没有长度限制,没有模糊的公式。 唯一的缺点是我能想到的是需要一个启用macros的工作簿。

任何用户的VBA函数都可以这样调用,以便将值返回给单元格公式,包括作为内置Excel函数的参数。

如果你打算使用这个函数,你需要检查字符不在string中的情况,然后string是空的,等等。