如何在VBA中将一个字符串拆分成二维数组?

4
我希望能够把一个格式化的字符串(如下所示)分割成一个数组(之后我会在使用)。
示例字符串:(x,f),(5,6),(6,1),(7,8),(8,5),(9,5),(10,5),(11,3),(12,4),(13,1),(14,6),(15,2),(16,10)
每组括号都是一个维度,其中的数字构成另一个维度。例如,strArray(4,2)将导致括号4,数字2->这在这种情况下是8。
我曾考虑过通过使用多个 SPLIT 函数来 brute force 处理它,并且我已经研究了正则表达式来完成它。 我有信心制作一个一维数组,但是处理二维数组时遇到了困难。
我正在使用 Microsoft Excel 2016,并且是 VBA 的中级程序员。
以下是我尝试处理每个括号的一种方法,但它不会产生二维数组:
Sub EvaluateString(txtString as String)

   txtArray = Split(txtSTring, "),(")

   If IsEmpty(txtArray) Then L=0 Else L=UBound(txtArray)

   'remove leading "(" and last ")"
   txtArray(0) = Replace(txtArray(0), "(", "")
   txtArray(L) = Replace(txtArray(L), ")", "")

   For i = 0 to L
      'Do something
   next i

End Sub
3个回答

4
有趣的问题。我建议利用一些Application方法从你的原始字符串中“切割”两个1D数组,然后通过Transpose将它们“合并”成一个单独的数组。
Sub Test()

'Prepare your string
Dim str As String: str = "(x, f), (5, 6), (6, 1), (7, 8), (8, 5), (9, 5), (10, 5), (11, 3), (12, 4), (13, 1), (14, 6), (15, 2), (16, 10)"
str = Replace(Replace(Replace(str, " ", ""), "(", ""), ")", "")

'Prepare your array
Dim arr As Variant: arr = Split(str, ",")
Dim lb As Long: lb = UBound(arr) + 1

'Prepare two "slicer" 1D-arrays
Dim slc1 As Variant: slc1 = Evaluate("TRANSPOSE((ROW(1:" & (lb / 2) & ")*2)-1)")
Dim slc2 As Variant: slc2 = Evaluate("TRANSPOSE(ROW(1:" & (lb / 2) & ")*2)")

'Slice your array and transpose it into a a single array to be used
With Application
    arr = .Transpose(Array(.Index(arr, 1, slc1), .Index(arr, 1, slc2)))
End With

Debug.Print arr(4, 2)

End Sub

2
如果我理解您的意思正确,可以尝试以下方法:
Sub test2()

Dim txtstring As String

txtstring = "(x, f),(5, 6),(6, 1),(7, 8),(8, 5),(9, 5),(10, 5),(11, 3),(12, 4),(13, 1),(14, 6),(15, 2),(16, 10)"

Call EvaluateString(txtstring)

End Sub

Sub EvaluateString(txtstring As String)

Dim txtArray2d As Variant

txtArray = Split(txtstring, "),(")

If IsEmpty(txtArray) Then L = 0 Else L = UBound(txtArray)

'remove leading "(" and last ")"
txtArray(0) = Replace(txtArray(0), "(", "")
txtArray(L) = Replace(txtArray(L), ")", "")

ReDim txtArray2d(0 To L, 1 To 2)

For i = 0 To L
   txtArray2d(i, 1) = Split(txtArray(i), ",")(0)
   txtArray2d(i, 2) = Trim(Split(txtArray(i), ",")(1))
Next i

End Sub

以您的字符串变量为例,2D数组的值如下所示:

Watch of 2d array

等等。


1

Excel 二维数组格式为 {"x", "f"; "5", "6"; "6", "1"},所以只需要进行少量替换即可:

Sub EvaluateString(txtString as String)

    txtString = Replace(Replace(txtString, " ", ""), "),(", """;""")

    txtString = Replace(Replace(Replace(txtString, "(", "{"""), ")", """}"), ",", """,""")

    txtArray = Evaluate(txtString)          ' txtArray is now 2D array Variant(1 to x, 1 to 2)

End Sub

请注意Application.Evaluate方法的字符数限制为255个。

这是一个如此简单而优雅的解决方案,谢谢。 - Alex
1
需要注意的唯一一件事是要评估的最大长度为255个字符。否则,是的,我同意,非常简单!点赞。 - JvdV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接