excel vba:使用动态构建的字符串来定义数组数组(对于.TextToColumns)

时间:2017-12-05 15:04:52

标签: arrays excel string vba excel-vba

编辑:标记的解决方案是正确的。我的问题是我在FieldInfo的{​​{1}}参数中增加了我正在使用的值,而不是使用分割的绝对位置 例如: .TextToColumns代替1, 3, 2, 5

ORIGINAL:

我正在构建一个工具,它将各种记录类型(以一列,多行形式出现)并将它们分成列(取决于数据行中的某些值)。

数据可能如下所示:

1, 4, 6, 11

可以指定为(recordtype 2 chars; YYYY;三个零填充;名称;填充空格; ID)

分隔符是根据记录类型(由用户定义)和子类型(通常由数据中的前1或2个数字定义,具体取决于记录类型)预定义的。

我正在使用.TextToColumns函数:

062017000JohnDoe   777E

在代码的前面,我构建了字符串

DataToParse.TextToColumns Destination:=DataToParse, DataType:=xlFixedWidth, _
FieldInfo:=FieldInfoString, TrailingMinusNumbers:=True

我使用连接构建字符串,添加",Array(x,1)"对于每个分隔符(循环遍历可变长度的x')。

' FieldInfoString'变量抛出错误。 FieldInfo 参数应该包含:

FieldInfoString = "Array(Array(0,1), Array(5,1), Array(12,1))"

为许多不同的文件类型动态创建字符串。 有没有办法使用这个字符串来定义在.TextToColumns中使用的数组?

我还尝试改变我的方法并动态构建数组:

FieldInfo:=Array(Array(0,1), Array(5,1), Array(12,1))

第一个条目是(0,1)

Dim FieldInfoArray()

' Here there is code to define DelimitersToParse - which ends up being a 1 column by x rows 
' group of numbers that will be the first value in the arrays > i.e. Array(___, 1)

ReDim Preserve FieldInfoArray(DelimitersToParse.Rows.Count)

数组方法不会抛出错误,数据会被拆分,但不会被我定义的任何分隔符拆分。我不确定如何审核 FieldInfoArray 以查看发生了什么。

编辑:尝试过@jochen的回答,审核我的阵列。仍有问题 - 77777应放在一列中,但拆分为777 | 77

attempt at first answer

1 个答案:

答案 0 :(得分:1)

评论/编辑后完全编辑:

您的建筑方法没问题。你可以像上面一样循环使用变量构建一个带有数组的基于0的数组。

stop之前的行中输入TextToColumns,以查看数组的值和结构。使用一些测试值和一个简单的结构,它与我完美配合:

Sub test()
Dim Arr()
Dim v1 As Integer, v2 As Integer
ReDim Arr(0 To 4)

    v1 = 2: v2 = 6
    Arr(0) = Array(0, 2)
    Arr(1) = Array(v1, 1)
    Arr(2) = Array(v2, 2)
    Arr(3) = Array(9, 2)
    Arr(4) = Array(19, 2)

    Range("A2").TextToColumns Destination:=Range("A2"), DataType:=xlFixedWidth, _
        FieldInfo:=Arr, _
        TrailingMinusNumbers:=True

End Sub

编辑:

当你仍然遇到问题时(现在你的代码分裂了,但不是我所理解的正确位置),我再给你一个例子。

在我的示例表中,我有一个名为Data的Range,其中包含所提供示例数据结构中的数据(062017000JohnDoe 777E)。我有另一个Rangecalled Delimiters,带有宽度和类型的矩阵(在某些情况下我更喜欢使用Text,特别是如果我不想松散0和空白。我的Delimiter矩阵(5行,2列)看起来像:

0     2
2     1
6     2
9     2
19    2

然后我使用以下单行代码将Data拆分为列:

    Range("Data").TextToColumns Destination:=Range("Data"), DataType:=xlFixedWidth, _
        FieldInfo:=Range("Delimiters").Value2, _
        TrailingMinusNumbers:=True