Как разбить строку на 2-мерный массив в VBA? - PullRequest
4 голосов
/ 13 января 2020

Я хочу иметь возможность разбить отформатированную строку (например, следующую) на массив (который я затем буду использовать позже).

Пример строки: (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, и я посмотрел в регулярные выражения, чтобы сделать это. Я уверен в создании одномерного массива, но борюсь с двумерным массивом.

Я использую 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 голосов
/ 13 января 2020

Интересный вопрос. Я бы предложил использовать пару 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 голосов
/ 13 января 2020

Если я правильно вас понимаю, попробуйте следующее:

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

и, взяв в качестве примера ваш строковый вариант, значения двухмерного массива выглядят так:

Watch of 2d array

et c.

1 голос
/ 13 января 2020

Формат двумерного массива 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 символами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...