我试图转换数据:
Date;Employee;Ticket number;Table number
30/09/2016;Josh;005421;17
30/09/2016;Annie;004412;25
30/09/2016;John;001124;12
我需要更改第三列的格式,否则我将失去"零"。
预期结果:
我的代码如下:
Range("A6:A1048576").TextToColumns Destination:=Range("A6"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Semicolon:=True, Fieldinfo:=Array(Array(3,2))
问题是FIRST列的格式是用我的代码更改的,而不是第三列。我不明白为什么。
问题必须在这里:
Fieldinfo:=Array(Array(3,2))
Sub Macro1()
'
' Macro1 Macro
'
'
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 2), Array(4, 1)), TrailingMinusNumbers:= _
True
Range("B6").Select
End Sub
我的代码看起来与宏编辑器类似。因此,我不知道为什么我没有得到预期的结果。
你可以帮我一把吗?谢谢,祝你有个美好的一天
答案 0 :(得分:1)
由于您的宏录制器显示您需要指定
FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 2), Array(4, 1))
每列一个数组。
当数据分隔时,此参数是一个双元素数组的数组,每个双元素数组指定特定列的转换选项。第一个元素是列号(从1开始),第二个元素是指定如何解析列的xlColumnDataType常量之一。
以下是如何动态生成FieldInfo数组的示例:
首先,我们需要确定我们需要多少列。我们通过计算分号来做到这一点。
Sub GeneraterFieldInfoArrayExample()
Const cDelimiter As String = ";"
Dim str As String
str = "30/09/2016;Josh;005421;17" 'replace with representative data, something like ThisWorkbook.Worksheets("Sheet1").Range("A6").Value
Dim countCols As Long
countCols = Len(str) - Len(Replace(str, cDelimiter, "")) + 1 'determine how many columns are needed by counting semicolons. Afterwards we build the array.
Dim arrFieldInfo() As Variant
ReDim arrFieldInfo(countCols - 1) As Variant 'resize array
Dim iCol As Long
For iCol = 1 To countCols 'generate array for each column
Select Case iCol
Case 3, 10 'format column 3 and 10 as text
arrFieldInfo(iCol - 1) = Array(iCol, 2)
Case Else 'format any other columns as default
arrFieldInfo(iCol - 1) = Array(iCol, 1)
End Select
Next iCol
'use like: Fieldinfo:=arrFieldInfo()
End Sub
在第一种情况下,列出了必须格式化为文本的所有列。所有其他列成为默认格式。您可以根据需要添加其他案例。