Excel:string中的最后一个字符/string匹配
有没有一种有效的方法来识别使用基函数的string中的最后一个字符/string匹配? 即不是string的最后一个字符/string,而是string/string在string中最后一次出现的位置。 Search
和find
这两个工作从左到右,所以我想不出如何申请没有冗长的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是空的,等等。