VBA数据转换文本格式

VBA数据转换文本格式,vba,excel,excel-formula,Vba,Excel,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 我需要更改第三列的格式,否则我将丢失“零” 预期结果: 我的代码如下: Range("A6:A1048576").TextToColumns Destination:=Range("A6"), DataType:=xlDelimit

我正在尝试转换数据:

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))
问题是第一列的格式会随着我的代码而改变,而不是第三列。我不明白为什么

问题一定在这里:

 Fieldinfo:=Array(Array(3,2))
我用宏编辑器记录了这个过程:

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

你能帮我一下吗


谢谢,祝您度过愉快的一天,因为您的宏录制器显示您需要指定

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

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

我不清楚您的实际目标是什么。您能否添加数据在转换前的外观以及转换后的外观?“转换第一列而不是第三列”是什么意思?始终添加到您的问题中:您的代码实际上做了什么,您希望它做什么。始终尝试提供一个完全工作的宏。如果录制一个宏执行相同的操作,会发生什么情况?@Peh hi,这就是我想要的:原始数据:Date;员工;车票号码;表号30/09/2016;乔希;005421;17 30/09/2016;安妮;004412;25 30/09/2016;厕所;001124;12使用宏编辑器生成的代码:Sub Macro1()“”Macro1 macro“”列(“A:A”)。选择Selection.TextToColumns目标:=范围(“A1”)、数据类型:=xlDelimited、\uTextQualifier:=xlDoubleQuote、ConceutiveDelimiter:=False、Tab:=True、\u分号:=True、逗号:=False、空格:=False、其他:=False,FieldInfo:=数组(数组(1,1),数组(2,1),数组(3,2),数组(4,1)),TrailingMinusNumbers:=\uuuTrue Range(“B6”)。选择结束子请使用按钮将其添加到您的问题中,并对其进行良好格式化。这是不可读的。佩赫,谢谢你的回答。这个解决方案让我有点“恼火”。实际上,我需要在一个包含大约100列的文件上执行此操作。。。有没有其他解决方案可以让代码看起来更轻一点?阅读类似于
FieldInfo:=Array(Array(3,2))
的解决方案也适用于
DataType:=xlDelimited
,但不知怎的,它不起作用。所以我只看到了动态创建这个巨大数组的机会。谢谢,我稍后再尝试一下,等我有时间的时候。我希望代码不会变得太慢。我会让你知道它是如何工作的,或者我是否能同时找到其他解决方案。再见:)嗨,谢谢你的帮助。我做了最丑陋的事情,用了一个巨大的数组(163列哈哈)。这很有效,但我想做得更好。。。我读到我可以动态地做这个,而不是重复数组(1,1),数组(2,1)等等。我需要从这样的教程中启发自己来生成一个动态数组吗?Thxxxx@Jean FIC我添加了一个示例,说明如何为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