String VBA 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

我在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(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