【VBA研究】读取Unix下的文本文件到工作表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iamlaosong/article/details/83416605

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 读取/写入文本文件

猜你喜欢

转载自blog.csdn.net/iamlaosong/article/details/83416605
今日推荐