String VBA Excel在字符串中查找最后一个特定实例
我在excel中有一个字符串列表,如下所示:String VBA Excel在字符串中查找最后一个特定实例,string,excel,vba,String,Excel,Vba,我在excel中有一个字符串列表,如下所示: a>b>b>d>c>a a>b>c>d b>b>b>d>d>a 等等 我想从每个字符串中提取最后一个c或最后一个d,以最后一个为准 e、 g 我将如何使用VBA(如果可能的话,也可以直接使用excel)实现这一点 假设字符串位于单元格A1中,并且其中没有波浪号(~)字符,则可以在工作表中使用以下内容: =IF(IFERROR(FIND("~",SUBSTITUTE(A
a>b>b>d>c>a
a>b>c>d
b>b>b>d>d>a
等等
我想从每个字符串中提取最后一个c或最后一个d,以最后一个为准
e、 g
我将如何使用VBA(如果可能的话,也可以直接使用excel)实现这一点 假设字符串位于单元格A1中,并且其中没有波浪号(~)字符,则可以在工作表中使用以下内容:
=IF(IFERROR(FIND("~",SUBSTITUTE(A1,"c","~",LEN(A1)-LEN(SUBSTITUTE(A1,"c","")))),0)>IFERROR(FIND("~",SUBSTITUTE(A1,"d","~",LEN(A1)-LEN(SUBSTITUTE(A1,"d","")))),0),"c","d")
编辑:作为对一条评论的回应,以下是对其工作原理的解释。在再次回顾之后,我也稍微整理了一下公式。
c
和d
的两个公式是相同的,因此解释将适用于这两个公式。所以,向外工作
LEN(A1)-LEN(SUBSTITUTE(A1,"c",""))
这里我们从字符串中删除c
的所有实例。通过比较此计算字符串和原始字符串的长度,我们计算原始字符串中出现c
的次数
SUBSTITUTE(A1,"c","~",LEN(A1)-LEN(SUBSTITUTE(A1,"c","")))
现在我们知道c
出现在字符串中的次数,我们
将最后出现的c
替换为tilde字符(这里我们假设在字符串中没有使用tilde)
然后我们找到波浪线在字符串中的位置,它相当于字符串中最后一个c
的位置
IFERROR(FIND("~",SUBSTITUTE(A1,"c","~",LEN(A1)-LEN(SUBSTITUTE(A1,"c","")))),0)
将其包装在IFERROR
中可确保公式中没有错误-如果不存在c
则将值设置为0可确保在字符串包含c
但不包含d
(反之亦然)时仍能得到正确答案
然后,我们将相同的计算应用于
d
,并比较这两个值,以查看后面在字符串中出现的值。注意:如果字符串中既没有c
也没有d
,则回答不正确。假设字符串位于单元格A1中,并且其中没有波浪号(~)字符,则可以在工作表中使用以下内容:
=IF(IFERROR(FIND("~",SUBSTITUTE(A1,"c","~",LEN(A1)-LEN(SUBSTITUTE(A1,"c","")))),0)>IFERROR(FIND("~",SUBSTITUTE(A1,"d","~",LEN(A1)-LEN(SUBSTITUTE(A1,"d","")))),0),"c","d")
IFERROR(FIND("~",SUBSTITUTE(A1,"c","~",LEN(A1)-LEN(SUBSTITUTE(A1,"c","")))),0)
编辑:作为对一条评论的回应,以下是对其工作原理的解释。在再次回顾之后,我也稍微整理了一下公式。
c
和d
的两个公式是相同的,因此解释将适用于这两个公式。所以,向外工作
LEN(A1)-LEN(SUBSTITUTE(A1,"c",""))
这里我们从字符串中删除c
的所有实例。通过比较此计算字符串和原始字符串的长度,我们计算原始字符串中出现c
的次数
SUBSTITUTE(A1,"c","~",LEN(A1)-LEN(SUBSTITUTE(A1,"c","")))
现在我们知道c
出现在字符串中的次数,我们
将最后出现的c
替换为tilde字符(这里我们假设在字符串中没有使用tilde)
然后我们找到波浪线在字符串中的位置,它相当于字符串中最后一个c
的位置
IFERROR(FIND("~",SUBSTITUTE(A1,"c","~",LEN(A1)-LEN(SUBSTITUTE(A1,"c","")))),0)
将其包装在IFERROR
中可确保公式中没有错误-如果不存在c
则将值设置为0可确保在字符串包含c
但不包含d
(反之亦然)时仍能得到正确答案
然后,我们将相同的计算应用于
d
,并比较这两个值,以查看后面在字符串中出现的值。注意:如果字符串中既没有c
也没有d
,则会给出错误的答案。您可以使用如下excel公式
IFERROR(FIND("~",SUBSTITUTE(A1,"c","~",LEN(A1)-LEN(SUBSTITUTE(A1,"c","")))),0)
帮助解释将从一个字母开始,然后在结尾显示完整的公式
首先查找c的出现次数
= LEN(A1) - LEN(SUBSTITUTE(A1,"c","")
使用此位置将最后一个c替换为唯一字符($作为示例)
接下来找到这个独特的角色
= FIND("$",SUBSTITUTE(A1,"c","$",LEN(A1) - LEN(SUBSTITUTE(A1,"c",""))))
这给出了最后一个c的位置,现在可以在mid函数中使用它来返回最后一个c
= MID(A1,FIND("$",SUBSTITUTE(A1,"c","$",LEN(A1) - LEN(SUBSTITUTE(A1,"c","")))),1)
最后,要计算c和d,请使用最大值返回最后一个
= MID(A1,MAX(IFERROR(FIND("$",SUBSTITUTE(A1,"c","$",LEN(A1) - LEN(SUBSTITUTE(A1,"c","")))),0),IFERROR(FIND("$",SUBSTITUTE(A1,"d","$",LEN(A1) - LEN(SUBSTITUTE(A1,"d","")))),0)),1)
您可以使用以下excel公式 帮助解释将从一个字母开始,然后在结尾显示完整的公式 首先查找c的出现次数
= LEN(A1) - LEN(SUBSTITUTE(A1,"c","")
使用此位置将最后一个c替换为唯一字符($作为示例)
接下来找到这个独特的角色
= FIND("$",SUBSTITUTE(A1,"c","$",LEN(A1) - LEN(SUBSTITUTE(A1,"c",""))))
这给出了最后一个c的位置,现在可以在mid函数中使用它来返回最后一个c
= MID(A1,FIND("$",SUBSTITUTE(A1,"c","$",LEN(A1) - LEN(SUBSTITUTE(A1,"c","")))),1)
最后,要计算c和d,请使用最大值返回最后一个
= MID(A1,MAX(IFERROR(FIND("$",SUBSTITUTE(A1,"c","$",LEN(A1) - LEN(SUBSTITUTE(A1,"c","")))),0),IFERROR(FIND("$",SUBSTITUTE(A1,"d","$",LEN(A1) - LEN(SUBSTITUTE(A1,"d","")))),0)),1)
在VBA中,可以使用以下简单逻辑来完成此操作
Dim str As String
str = "a>b>b>d>c>a"
Dim Cet
Cet = split(str,">")
Dim i as Integer
For i= Ubound(Cet) to Lbound(Cet)
If Cet(i) = "c" or "d" or "C" or "D" then
MsgBox Cet(i)
Exit For
End if
Next i
在VBA中,可以使用以下简单逻辑来完成此操作
Dim str As String
str = "a>b>b>d>c>a"
Dim Cet
Cet = split(str,">")
Dim i as Integer
For i= Ubound(Cet) to Lbound(Cet)
If Cet(i) = "c" or "d" or "C" or "D" then
MsgBox Cet(i)
Exit For
End if
Next i
假设c/d只是示例:
?LastEither("b>b>b>d>d>a", "c", "d")
d
使用
Function LastEither(testStr As String, find1 As String, find2 As String) As String
Dim p1 As Long: p1 = InStrRev(testStr, find1)
Dim p2 As Long: p2 = InStrRev(testStr, find2)
If (p1 > p2) Then
LastEither = find1
ElseIf (p2 > 0) Then LastEither = find2
End If
End Function
一般解决方案:
?FindLastMatch("b>b>b>d>d>a>q>ZZ", ">", "c", "d")
d
?FindLastMatch("b>b>b>d>d>a>q>ZZ", ">", "c", "d", "q")
q
?FindLastMatch("b>b>b>d>d>a>q>ZZ>ppp", ">", "c", "d", "ZZ", "q")
ZZ
使用
假设c/d只是示例:
?LastEither("b>b>b>d>d>a", "c", "d")
d
使用
Function LastEither(testStr As String, find1 As String, find2 As String) As String
Dim p1 As Long: p1 = InStrRev(testStr, find1)
Dim p2 As Long: p2 = InStrRev(testStr, find2)
If (p1 > p2) Then
LastEither = find1
ElseIf (p2 > 0) Then LastEither = find2
End If
End Function
一般解决方案:
?FindLastMatch("b>b>b>d>d>a>q>ZZ", ">", "c", "d")
d
?FindLastMatch("b>b>b>d>d>a>q>ZZ", ">", "c", "d", "q")
q
?FindLastMatch("b>b>b>d>d>a>q>ZZ>ppp", ">", "c", "d", "ZZ", "q")
ZZ
使用
这里有一个数组公式可以做同样的事情。(更改了配方,以避免“Eh”培根等级指出的原始配方出现问题) 通过按住
ctrl+shift
,同时点击enter
,可以输入数组公式。如果操作正确,Excel将在公式栏中可以看到的公式周围放置大括号{…}
公式将返回一个#值如果字符串中既没有c
也没有d
,则代码>错误
IFERROR(FIND("~",SUBSTITUTE(A1,"c","~",LEN(A1)-LEN(SUBSTITUTE(A1,"c","")))),0)
EDIT:从您的一些评论中可以看出,您可能需要使用多个单字符的单词,我将介绍以下用户定义的函数。它允许您使用任意长度的单词,而且您不限于两个单词——您可以使用任意数量的单词
您将输入一个公式,例如:
=LastOne(A8,"Charlie","Delta")
或
其中I1和I2包含您希望检查的单词
这些单词需要用一个既不是字母也不是数字的分隔符来分隔
正则表达式(regex)由一个由单词或短语的管道分隔的列表构成。正则表达式中的管道与或相同。r开头和结尾处的\b