标签:VBA,Split函数
使用VBA时,有可能需要根据分隔符将字符串拆分为不同的部分。此时,就可以使用VBA的Split函数。
Split函数是ExcelVBA中的内置字符串函数,可用于根据分隔符拆分文本字符串。
Split函数语法
代码语言:javascript复制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函数将这个句子中的每个单词作为数组中单独项。
代码语言:javascript复制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函数来获取一个句子中的单词总数,也就是计算拆分文本得到的数组中的元素数。
代码语言:javascript复制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中创建一个自定义函数,该函数将文本作为输入并返回单词数。
代码语言:javascript复制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函数基于逗号作为分隔符返回数组。
代码语言:javascript复制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作为限制,那么字符串将只分为三部分。
代码语言:javascript复制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
如果想要将单行地址拆分为消息框中显示的格式时,可以使用。然后,可以创建一个自定义函数,该函数将返回分为三部分的地址(每一部分在新行中)。
代码语言:javascript复制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个元素)。
代码语言:javascript复制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
注意,当所有地址的格式都一致时,这个自定义公式最合适——即城市总是在第一个逗号后出现。如果数据不一致,就不会得到想要的结果。
其实,上面的代码可以进一步简化为:
代码语言:javascript复制Function GetNthElementAdd(rngCellRef As Range, num As Integer)
GetNthElementAdd = Split(rngCellRef,",")(num - 1)
End Function
欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。