文件操作——读取

2020-07-28 10:55:04 浏览数 (1)

我们使用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里,我们要按顺序读取一个文本文档的数据的话,使用的是:

代码语言:javascript复制
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,随便输入一些东西:

代码语言:javascript复制
'以字节方式读取文本
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编码呢?这个我们后面再介绍。

0 人点赞