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