VBA打破大字符串

时间:2018-02-27 14:53:51

标签: vba excel-vba excel

我正在寻找关于将一个非常大的字符串分解成许多小字符串的建议。例如,我有一个5000个字符的字符串。我必须将该字符串拆分为不超过450个字符的连续变量数组。以下是最有效的方法吗?

Dim stringSection() as String

Private Sub extractSubStrings(giantString as String)

    Dim occurance as Integer

    occurance = 0
    For i = 1 to Len(giantString)
        If i Mod 450 = 1 Or i = Len(giantString) Then
            occurance = occurance + 1
            ReDim stringSection(occurance)
            stringSection = Mid(giantString, i-450, 450)
        End If
    Next i

End Sub

3 个答案:

答案 0 :(得分:5)

这是一个可能有用的VBA功能:

Function BreakUp(s As String, k As Long) As Variant
    'returns a 0-based variant array of strings of length <= k
    Dim i As Long, m As Long, n As Long
    Dim chunks As Variant
    n = Len(s)
    m = Int(n / k)
    If n - k * m > 0 Then 'leftover chunk at end
        ReDim chunks(0 To m)
    Else
        ReDim chunks(0 To m - 1)
    End If
    For i = 0 To UBound(chunks)
        chunks(i) = Mid(s, 1 + k * i, k)
    Next i
    BreakUp = chunks
End Function

获取数组之后,您可以对其进行迭代,但是如果 all 您想要做的是迭代它,那么上述函数与仅使用Mid相比没有任何实际好处调用代码中的循环。

答案 1 :(得分:1)

这是一个基于强制分隔符利用Split保持简单的函数。如果您的字符串可以包含/

,请将分隔符更改为合适的分隔符
Function cut_into_pieces(txt As String, piece_length As Long) As Variant
    Dim x As Long, delim As String
    delim = "/"
    pieces = ""
    For x = 0 To Int(Len(txt) / piece_length)
        this_piece = Mid(txt, 1 + (x * piece_length), piece_length)
        If this_piece <> "" Then cut_into_pieces = cut_into_pieces & this_piece & delim
    Next
    cut_into_pieces = Split(Left(cut_into_pieces, Len(cut_into_pieces) - 1), delim)
End Function

您可以使用arr = cut_into_pieces(giantString, 450)

来调用它

答案 2 :(得分:0)

ReDim使用了大量的内存,并且在循环中使用它们是一种很好的做法,在那里你需要ReDim大量的时间。你有没有使用Collection和Do Until循环?你为什么不尝试这个?

Private Sub extractSubStrings(ByVal giantString As String)

    Dim colOfSmallStrings As Collection

    Set colOfSmallStrings = New Collection

    Do
        colOfSmallStrings.Add Left$(giantString, 450)
        giantString = Mid$(giantString, 451, Len(giantString))

    Loop Until Len(giantString) < 450

    ' Add final piece of string
    colOfSmallStrings.Add Left(giantString, 450)
End Sub