大家好,我们今日讲解“VBA信息获取与处理”教程中第十四个专题“Split函数提取数据信息的深入讲解”的第三节“以多个给定符号作为间隔拆分字符串”,这个专题是非常实用的知识点,希望大家能掌握利用。教程会提供配套的程序文件。

第三节 以多个给定符号作为间隔拆分字符串

大家好,我们继续讲解用Split的引申函数拆分字符串。在上一讲中我们讲解了按照任意多个字符来拆分字符串的方案,但细心的朋友会提出自己的疑问,如果要根据多个字符如何拆分字符串呢?确实,如果拆分的标准改为多个字符串,按照上将的内容是无法得到正确的结果的,我们这讲就来解决这个问题。

实现的场景,如下图:


python 按csv某一字段分组统计_python把csv文件的多个工作表拆分


我们在给出的源字符串中,要求按照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

代码截图:


python 按csv某一字段分组统计_python 按csv某一字段分组统计_02


代码讲解:

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 实现按多个符号作为间隔进行拆分字符串的实现结果

我们点击运行按钮,看返回的结果:


python 按csv某一字段分组统计_VBA_03


上面截图完全实现了我们的目的,对于重复字符的测试读者可以自己进行。

本节知识点回向:

① SplitB函数的意义是什么?

② SplitB函数的和SplitA有什么不同?

本讲代码参考文件:014工作表.xlsm