我们使用Excel VBA绝大多数情况都是在处理Excel的数据,一般都是直接读取Excel,也就是使用Workbooks.Open,随着VBA使用的深入,我们要处理的数据可能不局限在Excel里,有时候也会需要去读取外部的数据。
在电脑里,所有的文件都是硬盘上的一些数据,也就是010101那种东西。Excel自然也是,我们在Excel VBA对象模型里提到过这个,之所以我们使用Workbooks.Open能够打开Excel,是因为VBA里已经做好了这个功能,其实Workbooks.Open也能打开txt文本文档,只要数据是比较规范的,可以看官网文档的介绍。
1、txt文本文档的读取:
在Windows系统里,我们一般都使用过txt后缀的文本文档,这种文件的数据是非常简单的,所有的数据都是按顺序排列的,不存在特殊的结构。
Excel文档的数据就不是这样的,07版本之前,也就是后缀为.xls的,那时候Excel的数据是使用一种叫做复合文档的结构存储的。07版本之后,也就是后缀为.xlsx的,其实它就是一个zip的压缩包,解压出来后主要一些xml的文本文档,和我们了解的txt文本文档是一样的,作为一个单独的文本文档来说,它就是按顺序排列的数据,没有特殊的结构。但是这些xml文本文档之间是有联系的。
在VBA里,我们要按顺序读取一个文本文档的数据的话,使用的是:
Open pathname For mode [ Access access ] [ lock ] As [ # ] filenumber [ Len = reclength ]
Get [ # ] filenumber, [ recnumber ], varname
Close [ filenumberlist ]
打开Open-读取Get-关闭Close,标准的3个步骤,记得按F1去看看官方文档。
如果我们使用mode为Binary,这时候就是按照二进制形式顺序去读取文件的数据,其实所有的文件都是可以这样去读取的,因为所有的文件都是硬盘上的一些数据,也就是010101那种东西。
所以读取文件最底层的方法都是这种方式,VBA里还提供了Input等,可以直接读取文本,其实可以理解它就是在Binary Get 基础上,再进行了一些封装处理。
2、文件读取代码
我们来尝试读取一个文件试试,在程序文件的同1个目录下建立1个txt文档,命名为test.txt,随便输入一些东西:
'以字节方式读取文本
Sub ReadTxtByOpenBin()
Dim num_file As Integer
Dim str As String
Dim b() As Byte
'获取1个文件号
num_file = VBA.FreeFile()
'打开文件
Open ThisWorkbook.Path & "\test.txt" For Binary Access Read As #num_file
'VBA.LOF(num_file)返回num_file这个文件的字节数
ReDim b(VBA.LOF(num_file) - 1) As Byte
'读取数据,读取的字节数就是数组b的大小
Get #num_file, 1, b
'关闭文件
Close #num_file
'将ANSI编码的字节转换为Unicode
str = VBA.StrConv(b, vbUnicode)
Debug.Print str
End Sub
没出什么问题的话,程序就能输出你刚才在test.txt中输入的内容。
StrConv是一个编码转换的函数,我们新建1个文本文档,为什么会是ANSI编码呢?这个我们后面再介绍。