vba 自定义function返回值_VBA专题03:InStr函数

学习Excel技术,关注微信公众号:

excelperfect

在VBA中,InStr函数是一个非常有用的函数,可用于查找某字符串在另一个字符串中第一次出现的位置。

InStr函数的语法如下图1所示:

5510d66aa78ff6f5142acab71a92831a.png

图1

其中:

1.参数Start,可选,指定搜索的起始位置。如果省略该参数,则会从String1的第一个字符开始查找。

2.参数String1,必需,被搜索的字符串。

3.参数String2,必需,要搜索的字符串。

4.参数Compare,可选,指定比较模式。默认为vbBinaryCompare模式,即二进制比较,还可以指定为vbTextCompare模式(文本比较,不区分大小写)和vbDatabaseCompare模式(数据库比较,只适用于Access)。如果指定该参数,就要同时指定参数Start。如果省略该参数,比较模式由Option Compare语句值决定。

简单地说,InStr函数就是查找String2在String1中第一次出现的位置。

InStr函数的返回值有以下几种情形:

1.如果String1长度为0,则返回值0。

2.如果String1为Null,则返回值Null。

3.如果String2长度为0,则返回参数Start的值。

4.如果String2为Null,则返回值Null。

5.如果找不到String2,则返回值0。

6.如果在String1中找到了String2,则返回String2被找到的位置。

7.如果参数Start指定的数值大于String2的长度,,则返回值0。

示例1:获取字符出现的位置

下面的代码返回一个字符在另一个字符中出现的位置:

Sub InstrSample1()

    Dim str1 As String

    Dim str2 As String

    Dim iPos As Long

    str1 = "我的微信公众号是完美Excel"

    str2 = "完美Excel"

    iPos = InStr(1, str1,str2)

    Debug.Print str2 &" 出现在 " & str1 & " 的第"& iPos & "个字符."

End Sub

运行结果如下图2所示。

a931f692bc0b3fd3eb744fce33284e03.png

图2

示例2:统计字符串中包含某子字符串的数量

下面的代码统计字符串str1中发现字符串str2的个数:

Sub InstrSample2()

    Dim str1 As String

    Dim str2 As String

    Dim str As String

    Dim iPos As Long

    Dim iCount As Long

    str1 ="ABCDABEF"

    str2 = "AB"

    str = str1

    iPos = InStr(1, str1,str2)

    Do While (iPos <>0)

        iCount = iCount + 1

        str1 = Mid(str1, iPos+ Len(str2))

        iPos = InStr(1, str1,str2)

    Loop

    Debug.Print"""" & str & """" & "中共有" &iCount & "个" & "字符串""" & str2 & """"

End Sub

运行结果如下图3所示。

f5e50441409da9a7998df9aa3f33a7dd.png

图3

示例3:获取字符出现的多个位置

如果一个字符串在另一个字符串中多次出现,要获取该字符串出现的这些位置值,示例代码如下:

Sub InstrSample3()

    Dim str1 As String

    Dim str2 As String

    Dim str As String

    Dim iPos As Long

    Dim iPos1 As Long

    Dim iPosAll() As Long

    Dim iCount As Long

    str1 ="ABCDABEFAB"

    str2 = "AB"

    str = str1

    iPos = InStr(1, str1,str2)

    iPos1 = iPos

    Do While (iPos <>0)

        iCount = iCount + 1

        ReDim Preserve iPosAll(1 To iCount)

        iPosAll(iCount) =iPos1

        str1 = Mid(str1, iPos+ Len(str2))

        iPos = InStr(1, str1,str2)

        iPos1 = iPos1 +Len(str2) + iPos - 1

    Loop

    Debug.Print"""" & str2 & """" & "出现在" &"""" & str & """" & "中的位置:"

    For iCount =LBound(iPosAll) To UBound(iPosAll)

        Debug.Print iPosAll(iCount)

    Next iCount

End Sub

运行结果如下图4所示。

83541d3752524db339082dfa1a0eb80b.png

图4

可以将上面的代码转换成一个自定义函数,由用户传递相应的参数,该函数返回由字符位置组成的数组:

Function InstrSample4(str1 As String, str2 As String) As Long()

    Dim iPos As Long

    Dim iPos1 As Long

    Dim iPosAll() As Long

    Dim iCount As Long

    iPos = InStr(1, str1,str2)

    iPos1 = iPos

    Do While (iPos <>0)

        iCount = iCount + 1

        ReDim Preserve iPosAll(1 To iCount)

        iPosAll(iCount) =iPos1

        str1 = Mid(str1, iPos+ Len(str2))

        iPos = InStr(1, str1,str2)

        iPos1 = iPos1 +Len(str2) + iPos - 1

    Loop

    InstrSample4 = iPosAll()

End Function

a7c6d2bbcb828f4b368b15a4e6da6d97.png

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页