【VBA研究】讀取Unix下的文字檔案到工作表
阿新 • • 發佈:2018-12-03
通常在VBA中讀檔案檔案時,習慣使用Line Input #fileNo, str的方法,這個方法對Windows下的文字檔案是可以的,例如下面的程式碼就是讀取文字檔案中的資料到Excel表中:
Sub ImpData1() Dim datFullName As String, rline As String Dim Arr() As String Dim row1, i, k As Integer datFullName = ThisWorkbook.Path & "\" & Cells(15, "O") '資料檔名 Open datFullName For Input As #1 ' 開啟檔案。 row1 = 2 stName = Cells(2, "P") Do While Not EOF(1) 'EOF(1)中的1是檔案號 Line Input #1, rline Arr = Split(rline, Chr(9)) 'Tab是分隔符 k = UBound(Arr) + 1 For i = 1 To k Sheets(stName).Cells(row1, i) = Arr(i - 1) Next i row1 = row1 + 1 Loop Close #1 MsgBox "賬單資料匯入完畢!", vbOKOnly, "中國郵政EMS" End Sub
但是這種方式無法處理Unix下的文字檔案,這是因為兩種系統下換行符不同:Windows下是回車換行兩個字元chr(10)&chr(13),而Unix下只有一個換行符chr(10),也就是Windows中的軟回車。
當然你可以通過工具將Unix下的文字檔案轉換成Windows下的文字檔案,但更好的辦法是直接處理Unix下的文字檔案。通過FSO的物件來處理文字檔案,可以不用關心文字檔案是什麼系統下的,ReadLine()方法可以正確讀取兩種格式下的內容。我們在處理某行的對賬單資料時其格式就是Unix下的,而且分隔符采用ASCII值為01的字元,讀取到Excel工作表中的程式碼如下:
'匯入銀行資料到賬單工作表 Sub ImpData() Dim datFullName As String, rline As String Dim Arr() As String Dim row1, i, k As Integer, MaxRow As Long, lineno As Long Dim fso As Object, ts As Object 'Const ForWriting = 2 '使用fso時,需要在VBA工程中引入:Microsoft Script Runtime庫。 Set fso = CreateObject("Scripting.FileSystemObject") datFullName = ThisWorkbook.Path & "\" & Cells(7, "O") '資料檔名,第7行 Set ts = fso.OpenTextFile(datFullName, ForReading, True) row1 = 2 stName = Cells(2, "P") With Sheets(stName) '清除資料 ExcelRowNo = .Cells.Rows.Count MaxRow = .Range("A" & ExcelRowNo).End(xlUp).Row .Rows("2:" & MaxRow).ClearContents '清除行內容,全清用clear Do While Not ts.AtEndOfStream rline = ts.ReadLine Arr = Split(rline, Chr(1)) '分隔符ASCII值為01 k = UBound(Arr) + 1 For i = 1 To k .Cells(row1, i) = Arr(i - 1) Next i row1 = row1 + 1 Loop ts.Close End With MsgBox "賬單資料匯入完畢!", vbOKOnly, "中國郵政EMS" End Sub
需要注意的是,使用FSO時,需要在VBA工程中引入:Microsoft Scripting Runtime庫。如下圖:
參見:VBA 讀寫文字檔案的幾種方法、VBA 讀取/寫入文字檔案