大家好,我们今日讲解“VBA信息获取与处理”教程中第十四个专题“Split函数提取数据信息的深入讲解”的第三节“以多个给定符号作为间隔拆分字符串”,这个专题是非常实用的知识点,希望大家能掌握利用。教程会提供配套的程序文件。
第三节 以多个给定符号作为间隔拆分字符串
大家好,我们继续讲解用Split的引申函数拆分字符串。在上一讲中我们讲解了按照任意多个字符来拆分字符串的方案,但细心的朋友会提出自己的疑问,如果要根据多个字符如何拆分字符串呢?确实,如果拆分的标准改为多个字符串,按照上将的内容是无法得到正确的结果的,我们这讲就来解决这个问题。
实现的场景,如下图:
我们在给出的源字符串中,要求按照B列的符号来拆分,B列的特点是含有多个字符串,这个时候我们考虑到各种情况。
1 实现按多个符号作为间隔进行拆分字符串的思路分析
为了实现按照多个符号来拆分,我们可以同样设计一个函数,这个函数中要给出拆分间隔的标准,这个时候的拆分标准我们用数组来装载。
为了按照拆分的标准来拆分字符串,我们需要在含有拆分标准的数组元素中建立一个循环,如果发现源字符串中包含其中之一的元素,那么就把源字符串中发现的这个符号替换成其他的特定符号,所有的源字符串中的符号替换完成后,我们只需要用Split这个函数进行分隔就可以了。
同样,我们还可以指定如果给出的分隔字符串有重复的处理方案。
2 实现按多个符号作为间隔进行拆分字符串的代码实现
我还是先给出我的代码,然后进行讲解:
Function SplitB(ByValInString As String, IgnoreDoubleDelmiters As Boolean, _
Delims() As String) As String()
'IgnoreDoubleDelmiters表示指示当两个delims之间没有文本时要做什么。
' 如果该值为True,则将连续分隔符压缩为单个分隔符。
' 如果此值为False,则连续分隔符将导致结果数组中的元素为空。
Dim Arr() As String
If Len(InString) = 0 Then
SplitB = Arr
Exit Function
End If
If IgnoreDoubleDelmiters = True Then
For Ndx = LBound(Delims) To UBound(Delims)
N = InStr(1, InString, Delims(Ndx) &Delims(Ndx), vbTextCompare)
Do Until N = 0
InString = Replace(InString, Delims(Ndx) &Delims(Ndx), Delims(Ndx))
N = InStr(1, InString, Delims(Ndx) &Delims(Ndx), vbTextCompare)
Loop
Next
End If
ReDimArr(1 To Len(InString))
For Ndx = LBound(Delims) To UBound(Delims)
InString = Replace(InString, Delims(Ndx), Chr(1))
Next
Arr = Split(InString, Chr(1))
SplitB = Arr
End Function
Sub mynzB()
Dim TT() As String
Sheets("SHEET3").Select
[c:aa].ClearContents
Range("c1") = "拆分结果"
I = 2
Do While Cells(I, 1) <> ""
TT() = Split(Cells(I, 2).Value)
UU = SplitB(Cells(I, 1).Value, True, TT)
For N = LBound(UU) To UBound(UU)
Cells(I, N + 3) = UU(N)
Next
I = I + 1
Loop
End Sub
代码截图:
代码讲解:
1)If IgnoreDoubleDelmiters = True Then
For Ndx = LBound(Delims) To UBound(Delims)
N = InStr(1, InString, Delims(Ndx) &Delims(Ndx), vbTextCompare)
Do Until N = 0
InString = Replace(InString, Delims(Ndx) &Delims(Ndx), Delims(Ndx))
N = InStr(1, InString, Delims(Ndx) &Delims(Ndx), vbTextCompare)
Loop
Next
End If
这段代码是IgnoreDoubleDelmiters参数的处理,表示指示当两个delims之间没有文本时要做什么。如果该值为True,则将连续分隔符压缩为单个分隔符。如果此值为False,则连续分隔符将导致结果数组中的元素为空。这个参数的测试读者可以自己进行,代码我已经给出。
代码中的InStr函数是一个字符串查找函数:其功能是查找一个字符串在另一个字符串中首次出现的位置。
语法:InStr([start,]string1,string2[,compare])
返回值:从 Start 位置开始,在 String1 中寻找 String2 ,如果没有找到,则返回0。如果 String1 或 String2 为Null,则返回Null,其他情况返回 String2 在 String1 中的起始位置。上述代码中用的是Do Until N = 0 指的就是直到没有发现为止。
2)ReDimArr(1 To Len(InString))
For Ndx = LBound(Delims) To UBound(Delims)
InString = Replace(InString, Delims(Ndx), Chr(1))
Next
Arr = Split(InString, Chr(1))
SplitB = Arr
以上代码是用Chr(1)符号代替了InString中的拆分标准符号,最后Arr = Split(InString, Chr(1))
用Chr(1)来分隔源字符串。
3)
Do While Cells(I, 1) <> ""
TT() = Split(Cells(I, 2).Value)
UU = SplitB(Cells(I, 1).Value, True, TT)
For N = LBound(UU) To UBound(UU)
Cells(I, N + 3) = UU(N)
Next
I = I + 1
Loop
在标准模块中就是利用了SplitB来实现我们的目的。大家要注意,在实现之前我利用了 TT() = Split(Cells(I, 2).Value) 来获取拆分间隔符号的参数。
3 实现按多个符号作为间隔进行拆分字符串的实现结果
我们点击运行按钮,看返回的结果:
上面截图完全实现了我们的目的,对于重复字符的测试读者可以自己进行。
本节知识点回向:
① SplitB函数的意义是什么?
② SplitB函数的和SplitA有什么不同?
本讲代码参考文件:014工作表.xlsm