2017-08-08 41 views
0

我在每行的末尾都有一個帶有段落標記的CSV文件,我必須循環CSV文件並使用VBA複製到Excel表格。請找到下面的代碼,我使用的,使用段落標記在VBA中循環CSV文件

Dim filePath As String 
Dim row_number As Integer 
Dim col_number As Integer 
Dim lineFromFile As String 
Dim lineItems As Variant 

fileName = "D:\test.csv" 

Open filePath For Input As #1 

row_number = 1 

Do Until EOF(1) 
    Line Input #1, lineFromFile 
    lineItems = Split(lineFromFile, ",") 
    col_number = 1 
    For i = 0 To 15 
     Sheets("Sheet1").Rows(row_number).Columns(col_number + i).value = lineItems(i) 
    row_number = row_number + 1 
Loop 
Close #1 

Image for CSV file showing paragraph marker

什麼問題是當控制器在年底達到段落標記,它是隻讀取第一行EOF會越來越真實。請對此提出一些意見。

+0

那麼你應該先確定最後的EOF值是什麼,然後直到你達到那個值,現在你停在一個。 – Luuklag

+0

Do中的1直到EOF(1)不是值或行號,它是文件的標識。如果我正在使用第二個文件,那麼將執行直到EOF(2)。 –

+0

也許會顯示更多的代碼,包括所有'Dim'語句,文件打開等,以便我們有充分的理解。 – FreeMan

回答

0

我找到了解決方案。由於最後換行,我無法通過循環讀取文件。所以我會分行和讀數據如下,

Line Input #1, lineFromFile 
lines = Split(lineFromFile, vbLf) 

For Each line In lines 
    lineItems = Split(line, ",") 
    Sheets("Sheet1").Rows(row_number).Columns(col_number + i).value = lineItems(i) 
Next line 

這工作對我來說很好。謝謝@ FreeMan,Luuklag。

0

我對閱讀文本文件並不是特別熟悉,但除非有辦法改變VBA所看到的EOL標記,否則您必須一次讀取一個字符的文件,填充您自己的內部字符串緩衝區,直到您到達段落標記。

即更換
Line Input #1, lineFromFile
用自己的功能 - 是這樣的:
lineFromFile = ReadALineFromMyFile(#1)
,在一次讀取一個字符,一旦它找到了段落標記返回lineFromFile

然後,您的代碼將識別爲「EOL」,並且可以處理您已填充的行緩衝區。

泡沫,沖洗,重複,直到你到達真正的EOF。

+0

謝謝@FreeMan,但是這裏的問題是一旦控件達到段落標記EOF被設置爲true並且控件從循環中出來。不循環任何其他行。 –