1. 程式人生 > >【VBA研究】讀取Unix下的文字檔案到工作表

【VBA研究】讀取Unix下的文字檔案到工作表

iamlaosong

通常在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 讀取/寫入文字檔案