Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA代码,用于将所有数据转换为具有任意分隔符数目的列_Excel_Vba - Fatal编程技术网

Excel VBA代码,用于将所有数据转换为具有任意分隔符数目的列

Excel VBA代码,用于将所有数据转换为具有任意分隔符数目的列,excel,vba,Excel,Vba,我想要一个宏,用于将管道分隔的csv/文本文件转换为列。当我录制宏时,它根据数据集中的列数进行了调整。如何修改此代码,使其能够容纳任意数量的列 Sub Pipe2Col() ' ' Pipe2Col Macro ' ' Keyboard Shortcut: Ctrl+t ' ActiveSheet.PasteSpecial Format:="Unicode Text", Link:=False, _ DisplayAsIcon:=False Columns("A:

我想要一个宏,用于将管道分隔的csv/文本文件转换为列。当我录制宏时,它根据数据集中的列数进行了调整。如何修改此代码,使其能够容纳任意数量的列

Sub Pipe2Col()
'
' Pipe2Col Macro
'
' Keyboard Shortcut: Ctrl+t
'
    ActiveSheet.PasteSpecial Format:="Unicode Text", Link:=False, _
        DisplayAsIcon:=False
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
        :="|", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _
        1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12 _
        , 1), Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), _
        Array(19, 1), Array(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array( _
        25, 1), Array(26, 1), Array(27, 1), Array(28, 1)), TrailingMinusNumbers:=True
End Sub

最简单的方法是预构建一个
FieldInfo
数组,您知道该数组大于源数据中的最大列数

这里我假设是100列。还清理了录音机的废话

Sub Demo()
    Dim ws As Worksheet
    Dim rng As Range
    Dim FieldInfo() As Variant
    Dim ColInfo() As Variant
    Dim i As Long

    Set ws = ActiveSheet

    Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(ws.Rows.Count, 1).End(xlUp))

    ReDim FieldInfo(0 To 99)
    ReDim ColInfo(0 To 1)
    ColInfo(1) = 1
    For i = 1 To 100
        ColInfo(0) = i
        FieldInfo(i - 1) = ColInfo
    Next

    rng.TextToColumns _
      Destination:=rng.Cells(1, 1), _
      DataType:=xlDelimited, _
      TextQualifier:=xlDoubleQuote, _
      ConsecutiveDelimiter:=False, _
      Tab:=False, _
      Semicolon:=False, _
      Comma:=False, _
      Space:=False, _
      Other:=True, _
      OtherChar:="|", _
      FieldInfo:=FieldInfo, _
      TrailingMinusNumbers:=True
End Sub

您希望它是动态的(检测列数)还是静态的列数?动态的,因为列数总是会变化。我尝试并观察到,您可以忽略“FieldInfo”,从而为每列生成多个数组,并将数据拆分为任意数量的列,并将文本转换为列。。所以,您可以使用相同的代码。谢谢!这似乎是最优雅的解决方案。你能把它写下来回答我吗?很有趣。你指的“录音机胡说八道”是什么?@Adam_G
Columns(“A:A”)。选择
Selection.TextToColumns
Destination:=Range(“A1”)
(顺便说一句,这不是挖苦你,只是录音机代码总是需要清理才能有用)明白了吗。谢谢你的澄清