34

如何将 VBA 字符串拆分为字符数组?

我试过Split(my_string, "")了,但这没有用。

4

7 回答 7

53

最安全和最简单的就是循环;

Dim buff() As String
ReDim buff(Len(my_string) - 1)
For i = 1 To Len(my_string)
    buff(i - 1) = Mid$(my_string, i, 1)
Next

如果您保证只能使用 ansi 字符,则可以;

Dim buff() As String
buff = Split(StrConv(my_string, vbUnicode), Chr$(0))
ReDim Preserve buff(UBound(buff) - 1)
于 2012-11-02T12:58:39.863 回答
16

您可以将字符串分配给字节数组(也可以反过来)。结果是每个字符有 2 个数字,因此 Xmas 转换为包含 {88,0,109,0,97,0,115,0} 的字节数组,
或者您可以使用 StrConv

Dim bytes() as Byte
bytes = StrConv("Xmas", vbFromUnicode)

这将为您提供 {88,109,97,115} 但在这种情况下,您无法将字节数组分配回字符串。
您可以使用 Chr() 函数将字节数组中的数字转换回字符

于 2012-11-02T14:10:05.730 回答
10

这是在 VBA 中执行此操作的另一种方法。

Function ConvertToArray(ByVal value As String)
    value = StrConv(value, vbUnicode)
    ConvertToArray = Split(Left(value, Len(value) - 1), vbNullChar)
End Function
Sub example()
    Dim originalString As String
    originalString = "hi there"
    Dim myArray() As String
    myArray = ConvertToArray(originalString)
End Sub
于 2012-11-02T12:58:15.420 回答
3

根据Gaffi 的这个代码打高尔夫球解决方案,以下工作:

a = Split(StrConv(s, 64), Chr(0))
于 2019-07-16T18:27:58.703 回答
0

问题是在 vb 中没有内置方法(或者至少我们都找不到)来做到这一点。但是,有一个可以在空格上拆分字符串,所以我只是重建字符串并添加到空格中......

Private Function characterArray(ByVal my_string As String) As String()
  'create a temporary string to store a new string of the same characters with spaces
  Dim tempString As String = ""
  'cycle through the characters and rebuild my_string as a string with spaces 
  'and assign the result to tempString.  
  For Each c In my_string
     tempString &= c & " "
  Next
  'return return tempString as a character array.  
  Return tempString.Split()
End Function
于 2015-04-17T04:41:11.667 回答
0

要将字符串拆分为任意长度的子字符串数组:

Function charSplitMulti(s As Variant, splitLen As Long) As Variant
    
        Dim padding As Long: padding = 0
        Dim l As Long: l = 0
        Dim v As Variant
        
        'Pad the string so it divides evenly by
        ' the length of the desired sub-strings
        Do While Len(s) Mod splitLen > 0
            s = s & "x"
            padding = padding + 1
        Loop
        
        'Create an array with sufficient
        ' elements to hold all the sub-strings
        Do Until Len(v) = (Len(s) / splitLen) - 1
            v = v & ","
        Loop
        v = Split(v, ",")
        
        'Populate the array by repeatedly
        ' adding in the first [splitLen]
        ' characters of the string, then
        ' removing them from the string
        Do While Not s Like ""
            v(l) = Mid(s, 1, splitLen)
            s = Right(s, Len(s) - splitLen)
            l = l + 1
        Loop
        
        'Remove any padding characters added at step one
        v(UBound(v)) = Left(v(UBound(v)), Len(v(UBound(v))) - padding)
        
        'Output the array
        charSplitMulti = v
    
    End Function

您可以将字符串作为字符串传递给它:

Sub test_charSplitMulti_stringInput()

    Dim s As String: s = "123456789abc"
    Dim subStrLen As Long: subStrLen = 4
    Dim myArray As Variant
    
    myArray = charSplitMulti(s, subStrLen)
    
    For i = 0 To UBound(myArray)
        MsgBox myArray(i)
    Next

End Sub

…或者已经声明为变体:

Sub test_charSplitMulti_variantInput()

    Dim s As Variant: s = "123456789abc"
    Dim subStrLen As Long: subStrLen = 5
    
    s = charSplitMulti(s, subStrLen)
    
    For i = 0 To UBound(s)
        MsgBox s(i)
    Next

End Sub

如果所需子字符串的长度不等于字符串的长度,则数组的最上面的元素会更短。(它将等于 strLength Mod subStrLength。这可能很明显。)

我发现我最常使用它来将字符串拆分为单个字符,所以我添加了另一个函数,这样我就可以偷懒并且在这种情况下不必传递两个变量:

Function charSplit(s As Variant) As Variant

    charSplit = charSplitMulti(s, 1)

End Function

Sub test_charSplit()

    Dim s As String: s = "123456789abc"
    Dim myArray As Variant
    
    myArray = charSplit(s)
    
    For i = 0 To UBound(myArray)
        MsgBox myArray(i)
    Next

End Sub
于 2021-11-23T21:15:33.467 回答
0

试试这个来自 Rara 的 minicode:

Function charSplitMulti(TheString As Variant, SplitLen As Long) As Variant
    'Defining a temporary array.
    Dim TmpArray() As String
    'Checking if the SplitLen is not less than one. if so the function returns the whole string without any changing.
    SplitLen = IIf(SplitLen >= 1, SplitLen, Len(TheString))
    'Redefining the temporary array as needed.
    ReDim TmpArray(Len(TheString) \ SplitLen + IIf(Len(TheString) Mod SplitLen <> 0, 1, 0))
    'Splitting the input string.
    For i = 1 To UBound(TmpArray)
        TmpArray(i) = Mid(TheString, (i - 1) * SplitLen + 1, SplitLen)
    Next
    'Outputing the result. 
    charSplitMulti = TmpArray
End Function
于 2021-12-16T13:20:55.537 回答