2016-02-25 274 views
1

我确信这是一个简单的请求,但我通常不使用任何VBA脚本,因此超出了我的理解。VBA将CSV文件以特定列格式保存到Excel中

我有一个大约700个.csv文件的文件夹是“|”基本上我想要做的就是打开这个特定的文件夹并将所有的.csv文件转换为.xls并将所有列格式化为“文本”而不​​是“一般”。我做了一些搜索,并找到了确切的代码来转换文件,但我无法弄清楚如何也使列文本。任何帮助将不胜感激!我试过寻找,但如果答案是其他地方,请点我正确的方向。 (以下是适用于.csv的.xs代码)

Sub CSVtoXls() 
Dim CSVfolder As String 
Dim XlsFolder As String 
Dim fname As String 
Dim wBook As Workbook 
CSVfolder = "C:\Users\del44\Desktop\CSV Files\" 
XlsFolder = "C:\Users\del44\Desktop\Excel Files\" 
fname = Dir(CSVfolder & "*.csv") 
Do While fname <> "" 
Set wBook = Workbooks.Open(CSVfolder & fname, Format:=6, Delimiter:="|") 
wBook.SaveAs XlsFolder & Replace(fname, ".csv", ".xls") 
wBook.Close False 
fname = Dir 
Loop 
Dim rCell As Range 

回答

1

重写。测试看看现在是否可行。

Sub CSVtoXls() 

Dim CSVfolder As String 
Dim XlsFolder As String 
Dim fname As String 
Dim LnLastRow As Long 
Dim StString As String 
Dim StSplit() As String 
Dim wBook As Workbook 
CSVfolder = "C:\Users\del44\Desktop\CSV Files\" 
XlsFolder = "C:\Users\del44\Desktop\Excel Files\" 
fname = Dir(CSVfolder & "*.csv") 
Do While fname <> "" 
Set wBook = Workbooks.Open(CSVfolder & fname, Format:=6, Delimiter:="|") 
LnLastRow = wBook.Sheets(1).Range("A1").End(xlDown).Row 
For i = 1 To LnLastRow 
    StString = wBook.Sheets(1).Cells(i, 1) 
    StSplit() = Split(Mid(StString, 1), "|") 
    For j = LBound(StSplit) To UBound(StSplit) 
     wBook.Sheets(1).Cells(i, (j + 1)) = "'" & StSplit(j) 
    Next j 
Next i 
wBook.SaveAs XlsFolder & Replace(fname, ".csv", ".xls"), FileFormat:=56 
wBook.Close False 
fname = Dir 
Loop 

Dim rCell As Range 

End Sub 

我已经退出选项“.textcolumns”,而是分裂每个细胞。看看这是否有帮助!

+0

感谢您的回复,但代码给我的结果与我的原始结果相同。更具体地说,我的问题是Excel是放弃我的前导零,也许你可以测试与领先零的数字列? –

+0

我已经重写了我以前的代码,现在分割每个单元格。 –

+0

完全按照我的需要工作......从你身上学到了一吨谢谢! –

1

CSV转换可能是一个痛苦的屁股!

不过,我测试过您的情况有一个简单的CSV文件看起来这

Scott|000|test 
Mark|10101010|test 
Brian|01010201|test 

而下面的代码为我工作。 (从这里插入代码格式化细胞您的原代码,我的书,结束了线。)

Set wBook = Workbooks.Open(CSVfolder & fname, Format:=6, Delimiter:="|") 

wBook.Sheets(1).Columns(1).TextToColumns _ 
     Destination:=Range("A1"), _ 
     DataType:=xlDelimited, _ 
     TextQualifier:=xlDoubleQuote, _ 
     ConsecutiveDelimiter:=False, _ 
     Tab:=False, _ 
     Semicolon:=False, _ 
     Comma:=False, _ 
     Space:=False, _ 
     Other:=True, _ 
     OtherChar:="|", _ 
     '*** this is the key! **** 
     FieldInfo:=Array(Array(1, 1), Array(2, 2), Array(3, 1)), _ 
     TrailingMinusNumbers:=True 

wBook.SaveAs XlsFolder & Replace(fname, ".csv", ".xls") 

这一工作的关键是FieldInfo说法。我会解释它在做什么,因为它会要求你调整它以适应你的数据。

  • Array保存的元素等于文件中的分隔列数(在我的情况下有三个)。
  • 每个元素是一个Array本身
  • Array(1,1)意味着,在格式化为General
  • Array(2,2)第一列表示该第二列被格式化为Text
  • 好措施Array(3,1)装置第3列被格式化为General

有关更多理解,请参阅Convert Text to Columns Wizard中的第3步手动转换文本到列。

+0

感谢您的反馈,但生成的文件与我的原始文件似乎相同。我特别需要将结果列作为文本,因为在转换excel时会丢弃前导零。也许你可以尝试使用具有前导零的数字的列进行测试? –

+0

@Scotty_,当工作簿打开(csv)工作簿到Excel中时,它是否具有前导零?如果是这样,那么在我的代码中的Open和Save方法之间移动'With'块。 –

+0

是的,当我打开CSV文件和Excel打开前导零。我试着移动“with”块,但它看起来是相同的结果(文件被转换而没有前导零)。也许我做错了什么,你能编辑/重新发布你的代码吗? –

相关问题