示例详解VBA的Split函数

标签:VBA,Split函数

使用VBA时,有可能需要根据分隔符将字符串拆分为不同的部分。此时,就可以使用VBA的Split函数。

Split函数是ExcelVBA中的内置字符串函数,可用于根据分隔符拆分文本字符串。

Split函数语法

Split(Expression,[Delimiter],[Limit],[Compare])

其中,

1.参数Expression,必需,指定要基于分隔符拆分的字符串。如果是一个长度为零的字符串(“”),SPLIT函数将返回一个空数组。

2.参数Deimiter,可选,指定用于拆分“Expression”参数的分隔符。如果不指定此参数,则空格字符被视为默认分隔符。如果给出一个长度为零的字符串(“”),函数将返回整个“Expression”字符串。

3.参数Limit,可选,指定要返回的子字符串的总数。例如,如果只想从“Expression”参数返回前三个子字符串,那么应该是3。如果不指定此参数,默认值为-1,返回所有子字符串。

4.参数Compare,可选,可以指定在评估子字符串时希望SPLIT函数执行的比较类型。以下选项可用:0,执行二进制比较,意味着区分大小写;1,执行文本比较,意味着不区分大小写。

示例1:拆分句子中的单词

假设有一段文本:“This is a goodidea”,可以使用Split函数将这个句子中的每个单词作为数组中单独项。

Sub SplitWords()
    Dim strText As String
    Dim strResult() As String
    Dim i As Long
    Dim str As String
    strText = "This is a good idea"
    strResult() = Split(strText)
    For i = LBound(strResult) ToUBound(strResult)
        str = str & strResult(i) &vbCrLf
    Next i
    MsgBox "拆分的单词:" &vbCrLf & str
End Sub

运行程序后的结果如下图1所示。

图1

在本示例中,只指定了第一个参数,即要拆分的文本。由于未指定分隔符,因此将空格字符作为默认分隔符。

注意:VBA Split函数返回索引基于0开始的数组。此外,将Split函数的结果赋值给数组时,该数组必须声明为字符串数据类型。如果将其声明为变量数据类型,则会显示类型不匹配错误)。在上面的示例中,已将strResult()声明为字符串数据类型。

示例2:统计句子中的单词数

可以使用Split函数来获取一个句子中的单词总数,也就是计算拆分文本得到的数组中的元素数。

Sub CountWords()
    Dim strText As String
    Dim strResult() As String
    Dim lngWordNum As Long
    strText = "This is a good idea"
    strResult = Split(strText)
    lngWordNum = UBound(strResult) + 1
    MsgBox "句子中的单词数:" &lngWordNum
End Sub

程序运行后的结果如下图2所示。

图2

在这种情况下,UBound函数告诉该数组的上限(即数组的最大元素数)。由于数组的索引基于为0,因此加1以获得总单词数。

可以使用类似的代码在VBA中创建一个自定义函数,该函数将文本作为输入并返回单词数。

Function GetWordNum(rngCellRef As Range)
    Dim strText As String
    Dim strResult() As String
    strResult =Split(WorksheetFunction.Trim(rngCellRef.Text), " ")
    GetWordNum = UBound(strResult) + 1
End Function

这样,可以在工作表中像使用Excel内置函数一样使用GetWordNum函数,如下图3所示。

图3

示例3:使用空格字符以外的分隔符

在前面的两个示例中,Split函数只使用了一个参数,其余的都是默认参数。如果要使用其他分隔符,那么需要在Split公式中指定该分隔符。

在下面的代码中,Split函数基于逗号作为分隔符返回数组。

Sub SplitWithComma()
    Dim strText As String
    Dim strResult() As String
    DimstrDisplay As String
    Dim i As Long
    strText = "This,is,a,good,idea"
    strResult = Split(strText, ",")
    For i = LBound(strResult) ToUBound(strResult)
        strDisplay = strDisplay &strResult(i) & vbNewLine
    Next i
    MsgBox "拆分的单词:" &vbNewLine & strDisplay
End Sub

运行后的结果如下图4所示。

图4

示例4:拆分句子为指定数量

通过Split函数,可以指定希望获得的拆分次数。例如,如果没有指定任何内容,分隔符的每个实例都将用于拆分字符串。

然而,如果指定3作为限制,那么字符串将只分为三部分。

Sub SplitWithCommaSep()
    Dim strText As String
    Dim strResult() As String
    Dim strDisplay As String
    Dim i As Long
    strText = "中国,湖北宜昌,西陵区,443000"
    strResult = Split(strText, ",",3)
    For i = LBound(strResult) ToUBound(strResult)
        strDisplay = strDisplay &strResult(i) & vbNewLine
    Next i
    MsgBox strDisplay
End Sub

运行程序后的结果如下图5所示。

图5

如果想要将单行地址拆分为消息框中显示的格式时,可以使用。然后,可以创建一个自定义函数,该函数将返回分为三部分的地址(每一部分在新行中)。

Function SplitAddress(rngCellRef As Range)
    Dim strText As String
    Dim strResult() As String
    Dim strDisplay As String
    Dim i As Long
    strResult = Split(rngCellRef, ",",3)
    For i = LBound(strResult) ToUBound(strResult)
        strDisplay = strDisplay &Trim(strResult(i)) & vbNewLine
    Next i
    SplitAddress = Mid(strDisplay, 1,Len(strDisplay) - 1)
End Function

这样,可以在工作表中像使用Excel内置函数一样使用SplitAddress函数,如下图6所示。

图6

示例5:获取文本中指定的字符串

使用VBA中的Split函数,可以指定要使用结果数组的哪个部分。

下面是一个自定义函数的代码,可以在其中指定一个数字,它将从数组中返回该元素。例如,如果想要城市名,可以指定2(因为它是数组中的第2个元素)。

Function GetNthElement(rngCellRef As Range, num As Integer)
    Dim strResult() As String
    strResult = Split(rngCellRef,",")
    GetNthElement = strResult(num - 1)
End Function

上面的函数有两个参数,一个是包含地址的单元格引用,另一个是要返回的元素位置,Split函数拆分并将其赋值给结果变量。

然后返回指定为第二个参数的元素。注意,由于索引基数为0,所以使用num-1正确返回所需元素。

示例结果如下图7所示。

图7

注意,当所有地址的格式都一致时,这个自定义公式最合适——即城市总是在第一个逗号后出现。如果数据不一致,就不会得到想要的结果。

其实,上面的代码可以进一步简化为:

Function GetNthElementAdd(rngCellRef As Range, num As Integer)
    GetNthElementAdd = Split(rngCellRef,",")(num - 1)
End Function

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

合智互联客户成功服务热线:400-1565-661

admin
admin管理员

上一篇:大规模分析您的 Prometheus 指标: Prometheus + Elasticsearch
下一篇:腾云先锋第四期招募令已出,TDP男孩女孩们 速来~~

留言评论

暂无留言