#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