【VBA研究】读取Unix下的文本文件到工作表
通常在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 读取/写入文本文件