VBA数据转换texte格式

时间:2017-05-03 07:18:08

标签: excel vba excel-vba excel-formula

我试图转换数据:

Date;Employee;Ticket number;Table number
30/09/2016;Josh;005421;17
30/09/2016;Annie;004412;25
30/09/2016;John;001124;12

我需要更改第三列的格式,否则我将失去"零"。

预期结果:

Expected result

我的代码如下:

 Range("A6:A1048576").TextToColumns Destination:=Range("A6"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Semicolon:=True, Fieldinfo:=Array(Array(3,2))

问题是FIRST列的格式是用我的代码更改的,而不是第三列。我不明白为什么。

问题必须在这里:

 Fieldinfo:=Array(Array(3,2))

我用宏编辑器录制了这个过程: Format text for col 3

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

我的代码看起来与宏编辑器类似。因此,我不知道为什么我没有得到预期的结果。

你可以帮我一把吗?

谢谢,祝你有个美好的一天

1 个答案:

答案 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

在第一种情况下,列出了必须格式化为文本的所有列。所有其他列成为默认格式。您可以根据需要添加其他案例。