Excel 文本到 VBA 中的列,每行中的分隔符数量可变?
Excel Text to Columns in VBA with variable number of delimiters in each row?
我正在 Excel 文件中处理一所大学的讲师评估。一行代表一个课程部分并包含该部分的所有学生评论。对于课程部分,评论的数量可以从 0 到 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
是数据存在的 table,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”类型不匹配错误
并且调试器显示
debugger
我不明白为什么这不起作用。据我所知,这不是真的吗?:
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))
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
我正在 Excel 文件中处理一所大学的讲师评估。一行代表一个课程部分并包含该部分的所有学生评论。对于课程部分,评论的数量可以从 0 到 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
是数据存在的 table,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”类型不匹配错误
并且调试器显示
debugger
我不明白为什么这不起作用。据我所知,这不是真的吗?:
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))
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