Текст Excel в столбцы в VBA с переменным количеством разделителей в каждой строке?

#excel #vba #csv #dynamic-arrays #dynamic-columns

Вопрос:

Я обрабатываю оценки преподавателей для колледжа в файле Excel. Одна строка представляет один раздел курса и содержит все комментарии студентов к этому разделу. Количество комментариев может быть от 0 и выше для раздела курса, и они объединены вместе с разделителем тильды («~») в одном столбце.

строки, разделенные тильдой
пример строк, разделенных тильдой

Мне поручено выполнить разделение текста по столбцам. Я хочу автоматизировать это, а не использовать текст для столбцов в меню. Я нашел необходимое количество столбцов, подсчитав количество тильд в каждой строке, и использовал максимальное число в качестве количества столбцов, которые мне нужно создать.

Для начала я записал макрос с помощью функции меню «Текст в столбцы» и получил следующее:

 Columns("B:B").Select
Selection.TextToColumns Destination:=Range("qNine_2[[#Headers],[Q9_1]]"), _
    DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter _
    :=False, Tab:=False, Semicolon:=False, Comma:=False, Space:=False, _
    Other:=True, OtherChar:="~", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array _
    (3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array( _
    10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1), _
    Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 1)), _
    TrailingMinusNumbers:=True
 

Моя проблема в том, что я не могу создать цикл, который будет заполнять атрибут FieldInfo.

Это цикл, который я создал, но он не работает. qNine_2 является ли таблица, в которой существуют данные q9_1 , столбцом со связанными комментариями, q9_max содержит количество столбцов для создания:

 Dim FieldValues() As Variant
Dim x As Integer
Dim tempArray(2) As Integer

tempArray(1) = 2

ReDim FieldValues(q9_max)

For x = 0 To q9_max - 1
    tempArray(0) = x   1
    FieldValues(x) = tempArray
Next x

Columns("B:B").Select
Selection.TextToColumns Destination:=Range("qNine_2[[#Headers],[Q9_1]]"), _
    DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, _
    ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar:="~", _
    FieldInfo:=FieldValues, _
    TrailingMinusNumbers:=True
 

Я получаю: Ошибка во время выполнения ’13’ ошибка несоответствия типа

и отладчик показывает

отладчик

Я не понимаю, почему это не работает. Насколько мне известно, разве это не должно быть правдой?:

 FieldValues = Array(Array(1, 1), Array(2, 1), Array _
        (3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array( _
        10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1), _
        Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 1))
 

Комментарии:

1. tempArray(2) имеет 3 элемента. Нет необходимости tempArray просто использовать FieldValues(x) = Array(x 1,1)

2. Также должно быть ReDim FieldValues(q9_max-1)

3. Пожалуйста, отредактируйте вопрос, чтобы ограничить его конкретной проблемой с достаточной детализацией для определения адекватного ответа.

Ответ №1:

 Sub SplitOnTilde()

    Dim FieldValues() As Variant
    Dim i As Integer, q9_max As Integer

    q9_max = 10 ' number of ~
    ReDim FieldValues(q9_max)
    For i = 0 To q9_max
        FieldValues(i) = Array(i   1, 2) ' 2 - text
    Next
    
    Columns("B:B").Select
    Selection.TextToColumns Destination:=Range("qNine_2[[#Headers],[Q9_1]]"), _
        DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Comma:=False, _
        Space:=False, Other:=True, OtherChar:="~", _
        FieldInfo:=FieldValues, _
        TrailingMinusNumbers:=True
End Sub