编辑:标记的解决方案是正确的。我的问题是我在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答案 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