乐于分享
好东西不私藏

Excel VBA 编程基础 -- 文件处理(九)

Excel VBA 编程基础 -- 文件处理(九)
我们已经讨论过文本文件和二进制文件,也讨论过文件的顺序读写和随机读写,今天我们讨论如何将一个用户自定义类型(UDT)作为随机读写的记录,以作为文件处理章节的结束。
在我们前面定义的 UDT 中,字符串类型 String 都是作为变长字符串类型出现的。如果要将 UDT 作为定长记录类型,则 UDT 中的 String 必须是定长字符串类型 String * n,如此整个 UDT 才能成为定长记录类型。
现在我们来讨论将下图的数据集写入二进制文件:
图1 数据集 Studen
第一步,先把这个数据集写入二进制文件。
例1. UDT 写入二进制文件
为此,先定义我们的 UDT:
TypeStudentNameAsString * 17CountryAsString * 24GenderAsString * 6BirthDateAsDateMathAsDoubleChineseAsDoubleEnglishAsDoubleEndType
在这个 UDT 中,字符串类型都按照最大长度定义为定长字符串。
有了 UDT 之后,就可以将数据集写入文件了,见下图:
图2 将数据集写入二进制文件
首先,我们使用的文件打开方式是 For Binary Access Write,这意味着打开二进制文件用于输出,写入文件的记录长度是 Len(rec),即 UDT 的长度。
然后,用一个 For 循环遍历 Excel 数据集,每一行组成一个 Student 记录,然后使用 Put 语句写入文件。
注意:这里的写入语句 Put 省略了 recnumber 参数,这意味着记录是顺序写入的,即当前记录紧接在前一个记录之后写入。
最后,关闭文件,完成文件操作。
由 Excel 数据集构造 Student 记录的代码如图3 所示:
图3 由 Excel 数据集构造 Student 记录
好了,数据文件已生成,下面来看如何随机读取文件记录。
例2. 随机读取 UDT 记录
图4 随机读取 UDT 记录
这个例子中使用了一个我们没有介绍的函数:LOF。
LOF
LOF 返回已打开文件的长度(字节数)。其一般格式是:
LOF(filenumber)
其中,filenumber 是已打开文件的文件号。LOF 返回一个 Long 型整数,表示以字节计数的文件长度。
注:对于未打开文件,获取文件长度的函数是 FileLen。
FileLen
其一般格式是:
FileLen(pathname)
其中,pathname 是文件的路径名。FileLen 返回 Long 型整数,表示以字节计数的文件长度。
现在回到图4。
打开文件之后,紧接着根据文件长度和记录长度计算文件中的最大记录号 maxRec。然后进入一个 Do ... Loop Until 循环,以 InputBox 和 MsgBox 构造一个简易的交互式界面。
首先检查用户输入,如果什么也没有输入,表示用户要退出。
如果输入的记录号不在范围内,则提示输入错误。
如果输入的是有效记录号,则使用 Get 语句读取该记录,并在立即窗口中打印出来。
使用记录号检索记录,实现简单,效率也高,但对用户不太友好,因为记录号对用户而言没有什么意义。如果使用名字检索,则需要对记录建立索引。这超出了我们这个“编程基础”的范围。
好了,对于 VBA 继承自 Basic 的文件处理工具的讨论,到这里就结束了。下面我们要转入对 VBA 现代文件处理方案的讨论。
相关阅读
Excel VBA 编程基础 -- 文件处理(一)
Excel VBA 编程基础 -- 文件处理(二)
Excel VBA 编程基础 -- 文件处理(三)
Excel VBA 编程基础 -- 文件处理(四)
Excel VBA 编程基础 -- 文件处理(五)
Excel VBA 编程基础 -- 文件处理(六)
Excel VBA 编程基础 -- 文件处理(七)
Excel VBA 编程基础 -- 文件处理(八)