如何在VBA中将字符串拆分为多个字符

如何在VBA中将字符串拆分为多个字符,vba,split,Vba,Split,在C#中,可以轻松地将拆分的字符串拆分为多个字符,可以提供一个拆分字符数组。我想知道在VBA中实现这一点的最佳方法是什么。我通常使用VBA.Split,但要在多个字符上进行拆分,需要钻取结果并对元素进行子拆分。然后,我们必须重新定义数组的尺寸等等,这相当痛苦 合同 请只回复VBA。如果愿意,可以使用.NET集合类()。如果愿意,可以使用JSON、XML作为分割段列表的容器。如果愿意,您可以使用简陋的VBA.Collection类,甚至可以使用Scripting.Dictionary。如果愿意,甚

在C#中,可以轻松地将拆分的字符串拆分为多个字符,可以提供一个拆分字符数组。我想知道在VBA中实现这一点的最佳方法是什么。我通常使用VBA.Split,但要在多个字符上进行拆分,需要钻取结果并对元素进行子拆分。然后,我们必须重新定义数组的尺寸等等,这相当痛苦

合同

请只回复VBA。如果愿意,可以使用.NET集合类()。如果愿意,可以使用JSON、XML作为分割段列表的容器。如果愿意,您可以使用简陋的VBA.Collection类,甚至可以使用Scripting.Dictionary。如果愿意,甚至可以使用伪造的记录集


我很清楚,可以编写一个.NET组件来调用.NET字符串.Split方法,并使用COM接口将程序集公开给VBA,但这方面的挑战在哪里。

在我的尝试中,我在按空格拆分之前,用空格替换所有其他字符。(所以我有点作弊。)

Private函数被多个字符拆分(ByVal sLine作为字符串)
'*
“*由Excel开发平台博客带给您
'* http://exceldevelopmentplatform.blogspot.com/2018/11/
'*
“*不要激动,这只会按空格分割
“*我们通过替换多个字符来伪造拆分
“*带空格
'*
Dim vChars2作为变型
vChars2=数组(“,”,“[”,“]”,“(“,”,“;”)
作为细绳的暗线2
sLine2=sLine
暗淡的LCHALLOOP尽可能长
对于lCharLoop=LBound(vChars2)到UBound(vChars2)
Assert Len(vChars2(lCharLoop))=1
sLine2=VBA.Replace(sLine2,vChars2(lCharLoop),“”)
下一个
splitbymorethanechars=VBA.Split(sLine2)
端函数

使用正则表达式应该很容易做到这一点。如果对要拆分的已传递字符的求反进行匹配,则匹配项将是输出数组的成员。这样做的好处是输出数组只需要调整一次大小,因为您可以获得由
RegExp
返回的匹配计数。这个模式构建起来相当简单——它可以归结为类似于
[^abc]+
的东西,其中“a”、“b”和“c”是要拆分的字符。准备表达式所需做的唯一一件事是在正则表达式中转义在该上下文中具有特殊意义的两个字符(我可能忘记了一些):

一旦有了模式,只需调整数组大小并迭代匹配项以分配它们(加上其他一些特殊情况处理,等等)即可:


用第一个字符替换“split”数组中的所有字符,然后在第一个字符上拆分,这通常更有用…很酷,这就是所涵盖的regExp角度。非常好+。Split(vbNullString)生成字符串(0到-1)多奇怪!
Private Function SplitByMoreThanOneChars(ByVal sLine As String)
    '*
    '* Brought to you by the Excel Development Platform Blog
    '* http://exceldevelopmentplatform.blogspot.com/2018/11/
    '*
    '* Don't get excited, this splits by spaces only
    '* we fake splitting by multiple characters by replacing those characters
    '* with spaces 
    '*
    Dim vChars2 As Variant
    vChars2 = Array(" ", "<", ">", "[", "]", "(", ")", ";")

    Dim sLine2 As String
    sLine2 = sLine

    Dim lCharLoop As Long
    For lCharLoop = LBound(vChars2) To UBound(vChars2)
        Debug.Assert Len(vChars2(lCharLoop)) = 1
        sLine2 = VBA.Replace(sLine2, vChars2(lCharLoop), " ")
    Next

    SplitByMoreThanOneChars = VBA.Split(sLine2)


End Function
Private Function BuildRegexPattern(ByVal inputString As String) As String
    Dim escapeTargets() As String
    escapeTargets = VBA.Split("- ^ \ ]")

    Dim returnValue As String
    returnValue = inputString

    Dim idx As Long
    For idx = LBound(escapeTargets) To UBound(escapeTargets)
        returnValue = Replace$(returnValue, escapeTargets(idx), "\" & escapeTargets(idx))
    Next
    BuildRegexPattern = "[^" & returnValue & "]+"
End Function
Public Function MultiSplit(ByVal toSplit As String, Optional ByVal delimiters As String = " ") As String()
    Dim returnValue() As String

    If toSplit = vbNullString Then
        returnValue = VBA.Split(vbNullString)
    Else
        With New RegExp
            .Pattern = BuildRegexPattern(IIf(delimiters = vbNullString, " ", delimiters))
            .MultiLine = True
            .Global = True
            If Not .Test(toSplit) Then
                'Only delimiters.
                ReDim returnValue(Len(toSplit) - 1)
            Else
                Dim matches As Object
                Set matches = .Execute(toSplit)
                ReDim returnValue(matches.Count - 1)
                Dim idx As Long
                For idx = LBound(returnValue) To UBound(returnValue)
                    returnValue(idx) = matches(idx)
                Next
            End If
        End With
    End If

    MultiSplit = returnValue
End Function