2016-02-25 175 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」塊,但它看起來是相同的結果(文件被轉換而沒有前導零)。也許我做錯了什麼,你能編輯/重新發布你的代碼嗎? –

相關問題