有没有以确定使用基函数的字符串的最后一个字符/字符串匹配的有效途径? 即串的不是最后一个字符/串,但字符/字符串的最后一次出现在字符串中的位置。 Search
和find
都工作由左到右,所以我想不出如何在不长的递归算法应用。 而这个解决方案现在看来已经过时。
Answer 1:
我觉得我得到你的意思。 比方说,比如你要在以下字符串最右边的\(存储在单元格A1):
驱动器:\文件夹\子文件夹\ FILENAME.EXT
为了得到最后的\的位置,你会使用这个公式:
=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)))
Answer 2:
如何创建自定义功能和使用您的公式? VBA有一个内置功能, InStrRev
,这不正是你要寻找的。
把这个新的模块:
Function RSearch(str As String, find As String)
RSearch = InStrRev(str, find)
End Function
而你的函数看起来就像这样(假设原始字符串是B1):
=LEFT(B1,RSearch(B1,"\"))
Answer 3:
tigeravatar和让 - 弗朗索瓦·科贝特建议用这个公式来生成“\”字符的最后一次出现的字符串权
=TRIM(RIGHT(SUBSTITUTE(A1,"\",REPT(" ",LEN(A1))),LEN(A1)))
如果用作分隔符的字符是空格,“”,则该公式必须被更改为:
=SUBSTITUTE(RIGHT(SUBSTITUTE(A1," ",REPT("{",LEN(A1))),LEN(A1))),"{","")
没有必要提及的“{”字符可以用不“正常”发生在处理文本的任何字符替换。
Answer 4:
您可以使用此功能,我创建的字符串中查找字符串的最后一个实例。
当然接受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, "\"))
Answer 5:
刚刚想出了这个解决方案,没有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"
希望这是有益的。
Answer 6:
我有点迟到了,但也许这将有助于。 在问题的链接也有类似的公式,但我使用IF()语句摆脱错误的。
如果你不害怕按Ctrl + Shift +的输入,你可以用数组公式做的相当不错。
字符串(在单元格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,14,FALSE,FALSE.....}
持续,
=MAX(IF(MID(I16,ROW($1:$99),1)=".",ROW($1:$99)))
返回数组的最大值: 14
这个公式的优点是,它是短暂的,比较容易理解,并且不需要任何独特的字符。
缺点是所需要的用Ctrl + Shift + Enter键和上串长度的限制的。 这可以合作周围用以下所示的变形例,但变异使用OFFSET()函数是易失性(读:慢)的功能。
不知道这个公式的速度是与他人。
变化:
=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!
Answer 7:
考虑所作评论的一部分@SSilk 我的最终目标确实已经得到的一切到最后一次出现的右侧有一个非常简单的公式另一种方法是复制的列(比如A
字符串和)的复印件(说ColumnB)申请查找和替换。 例如服用例如: Drive:\Folder\SubFolder\Filename.ext
这将返回剩下(这里Filename.ext
无论选择何种角色(这里的最后一个实例后) \
),这是无论如何有时客观,便于找到最后一个这样的字符的位置用短公式,例如:
=FIND(B1,A1)-1
Answer 8:
一个简单的方法做,在VBA是:
YourText = "c:\excel\text.txt"
xString = Mid(YourText, 2 + Len(YourText) - InStr(StrReverse(YourText), "\" ))
Answer 9:
非常迟到了,但一个简单的解决方案是使用VBA创建自定义的功能。
功能添加到VBA工作簿中的,工作表,或VBA模块
Function LastSegment(S, C)
LastSegment = Right(S, Len(S) - InStrRev(S, C))
End Function
然后单元式
=lastsegment(B1,"/")
在一个单元格,串在B1单元格中搜索将填充与文本后最后一个“/”从小区B1单元格。 没有长度限制,没有晦涩难懂的公式。 唯一的缺点我能想到的是启用了宏的工作簿的需要。
任何用户VBA功能可以被称为这样的值返回到一个单元格公式,包括作为参数的内建Excel函数。
如果你要使用的功能很大程度上你要检查的情况下,当字符不是字符串,那么字符串为空,等等。
Answer 10:
在Excel的新版本(2013及以上)闪光灯补可能是一个简单快捷的解决方案,请参阅: 使用闪光灯补在Excel中 。