VBA: Можно ли разделить элемент массива внутри самого массива?Попытка выдает ошибку «Несоответствие типов» - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь в Excel разбить элемент массива внутри самого массива, но без какой-либо удачи. Мне интересно, придется ли мне повторно редактировать элемент массива, но в то же время я не уверен, имеет ли это какой-то смысл или вообще возможно ли это. Одна вещь, которую я заметил, состоит в том, что элементы массива имеют тип string в массиве, что, как я подозреваю, также может быть источником ошибки Type Mismatch - несмотря на то, что массив Dim 'имеет вид variant.

Пример можно увидеть здесь:

Sub testarr()


    Dim arr As Variant, str As String, i As Integer

    str = "{test:[{test this here||Can it be split inside the array?}]}"

    arr = Split(str, "[{")

    For i = LBound(arr) To UBound(arr)
        arr(i) = Split(arr(i), "||")
    Next i
End Sub

Пример желаемой структуры массива:

Example of array structure

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Отвечая на мой собственный вопрос здесь.

Ответ @Storax указал мне правильное направление в моем конкретном случае, и поэтому я выбрал этот ответ как правильный.Как указывает Storax, это действительно было связано с несовместимостью между массивами variant и string.Поэтому я решил преобразовать массив из строки в вариант, и я нашел ответ на этот вопрос в этом посте - просто преобразовав его с помощью application.index().

Основой является простое использованиеновый массив ("newarr"), в котором постоянно преобразуются элементы в variant.Это позволяет разбить строку внутри элемента массива, создав в нем новый массив.

Обратите внимание, что ответ @Storax 'с использованием словаря полностью жизнеспособен, когда не используется Mac - что, к сожалению, мне нужноsupport.

Полную процедуру можно посмотреть здесь:

Sub testarr()


    Dim arr As Variant, str As String, i As Integer, newarr As Variant, j As Integer

    str = "{test:[{{test this here||Can it be split inside the array?},{ let's add another layer || why not?}}]}"

    arr = Split(str, "[{")

    newarr = Application.Index(arr, 1, 0)

    For i = LBound(arr) To UBound(arr)
        newarr(i + 1) = Split(arr(i), "},")
        newarr(i + 1) = Application.Index(newarr(i + 1), 1, 0)
        For j = LBound(newarr(i + 1)) To UBound(newarr(i + 1))
            newarr(i + 1)(j) = Split(newarr(i + 1)(j), "||")
        Next j
    Next i

End Sub
0 голосов
/ 17 сентября 2018

Несмотря на то, что arr обозначается как вариант, отдельные элементы становятся типами string, как только вы присваиваете им значения, как вы это сделали. Вы могли бы сделать что-то подобное

Sub testarr()


Dim arr As Variant, str As String, i As Integer
Dim v As Variant

    str = "{test:[{test this here||Can it be split inside the array?}]}"

    arr = Split(str, "[{")

    For i = LBound(arr) To UBound(arr)
        Debug.Print TypeName(arr(i))
        v = Split(arr(i), "||")
    Next i
End Sub

Обновление На основании комментариев от ОП можно попробовать сделать это, чтобы заменить исходный массив новым разделенным

Sub testarr()

Dim arr As Variant, str As String, i As Integer
Dim v As Variant, s As String

    str = "{test:[{test this here||Can it be split inside the array?}]}"

    arr = Split(str, "[{")

    For i = LBound(arr) To UBound(arr)
        'Debug.Print TypeName(arr(i))
        v = Split(arr(i), "||")
        s = s & "||" & Join(v, "||")
    Next i

    arr = Split(s, "||")

End Sub

Обновление 2 Опять же, на основе кода комментария ОП, который вернет структуру, описанную в посте ОП.

Sub testarr()

Dim arr As Variant, str As String, i As Integer
Dim v As Variant, s As String
Dim arr1 As Variant
Dim dic As New Scripting.Dictionary

    str = "{test:[{test this here||Can it be split inside the array?}]}"

    arr = Split(str, "[{")


    For i = LBound(arr) To UBound(arr)
       v = Split(arr(i), "||")
       If UBound(v) > 0 Then
           dic.Add i, v
       Else
           dic.Add i, arr(i)
       End If
    Next i



    ReDim arr1(dic.Count - 1)
    For i = 0 To dic.Count - 1
        arr1(i) = dic.Item(i)
    Next i

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