Excel VBA代码,用于将所有数据转换为具有任意分隔符数目的列
我想要一个宏,用于将管道分隔的csv/文本文件转换为列。当我录制宏时,它根据数据集中的列数进行了调整。如何修改此代码,使其能够容纳任意数量的列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:
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”)
(顺便说一句,这不是挖苦你,只是录音机代码总是需要清理才能有用)明白了吗。谢谢你的澄清