乐于分享
好东西不私藏

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

Excel VBA 编程基础 -- 文件处理(四)
我们仍然把 VBA 继承自 Basic 的早期文件处理工具列在下面作为参考:
表1 VBA 继承自 Basic 的文件处理工具
下面我们从文件的打开、关闭讲起。
Open
Open 用来打开文件,以便对文件进行读写操作。Open 也可以用来创建新文件。其一般格式是:
Open 语句的各个组成部分解释如下:
  • pathname 是字符串表达式,指定要打开/创建的文件名(可以包含驱动器和目录)。
  • mode 指定文件的打开方式。可用的打开方式如下:
    • Append:以 Append 方式打开,要求文件必须存在,像文件写入内容附加到文件已有内容之后。
    • Binary:以二进制方式打开,写入文件的内容为二进制数据。
    • Input:打开文件用于读取文件内容。
    • Output:打开文件用于向文件写入内容。
    • Random:以随机方式打开,记录可以写入文件指定位置,而非顺序写入。
  • access,可选,指定文件的访问方式:
    • Read:只从文件读取内容。
    • Write:只向文件写入内容。
    • Read Write:可以对文件进行读写。
  • lock,可选,指定文件在打开状态下限制其他进程对该文件的操作:
    • Shared:表示其他进程可打开该文件进行读写。
    • Lock Read:表示其他进程只允许向该文件写入。
    • Lock Write:表示其他进程只允许读取该文件。
    • Lock Read Write:表示其他进程不允许打开该文件。
  • filenumber 表示打开文件所用的文件号。每一个打开的文件都与一个整数形式的文件号相联系,后续的所有操作都是对该文件号的操作。
  • reclength,可选,不得大于 32767(字节)。对于以 Random 方式打开的文件,reclength 表示读写记录的长度。对于以非 Random 方式打开的文件,如果未指定 Binary 方式,则 reclength 表示读写缓冲区的长度(字符数);如果指定了 Binary 方式,则 reclength 被忽略。
文件的读写
从读写方式上,可以分为随机(Random)方式和顺序(Sequential)方式。如果在 Open 语句中指定了 Random,则表示对文件的读写是随机的。如果未指定 Random,则表示对文件的读写是顺序的。
从读写内容上,可以分为二进制(Binary)文件和文本(Text)文件。如果指定了 Binary,则表示文件内容是二进制文件。如果未指定 Binary,则表示是文本文件。对于二进制文件,内容的读写是以字节为单位进行的。对于文本文件,则是以字符为单位进行读写的。
例1. Open 用法示例
Open"D:\VBA_files\file1.txt" For Append Access Write As #1
因为 Open 语句需要其他语句配合才能完成工作,因此这里只简单演示 Open 语句的一种可能用法,后面再给出完整的示例。
Close
Close 用来关闭文件。其一般格式是:
Close [ filenumberlist ]
filenumberlist 的一般格式是:
[ [#filenumber ] [, [#filenumber ] ...
由此可见,Close 可以不带有参数,也可以带有一个或多个整数形式的文件号(filenumber),文件号前面可以缀以井号(#),也可以不缀。
例1. Close 用法示例
Close#1
这个例子表示关闭在 #1 上打开的文件。
注:Close 可以带有一个或多个文件号,表示关闭这些文件号所代表的文件。如果 Close 不带文件号,则表示关闭所有打开的文件。
FreeFile
FreeFile 用来获取空闲的文件号。其一般格式是:
FreeFile [ (rangenumber) ]
FreeFile 返回可用的文件号。rangenumber 是一个 Variant 类型的参数,指定 FreeFile 返回可用文件号的范围。rangenumber 可用的取值为0 和 1:
  • 0:默认值,表示 FreeFile 返回的文件号取自 1 - 255
  • 1:表示 FreeFile 返回的文件号取自 256 - 511
因为 VBA 要求每一个打开的文件都要独占一个文件号,所以,在有多个文件要打开访问的情况下,一定要使用 FreeFile 获取可用的文件号,避免直接在 Open 语句上指定文件号。
例1. FreeFile / Open / Close 用法示例
图1 FreeFile  / Open / Close 用法示例
这个例子演示了 Open 语句的写法,以及与之配套的 Close 和 FreeFile。
在了解了正常情况下的文件打开、关闭骨架之后,最后我们讨论一下另外一个关闭文件的语句。
Reset
Reset 用来在紧急情况下关闭所有打开的文件。
例1. Reset 用法示例
图2 Reset 用法示例
一般关于 Close 和 Reset 的最佳实践是:在正常情况下用 Close 关闭指定的文件,在出错情况下用 Reset 紧急关闭所有打开的文件。
Reset 是一个早期设计的遗留产物,针对的是早期的软硬件环境都不太稳定的情况。现在 Reset 的应用场景已经很少了,一方面是因为现在的软硬件环境的稳定性大大提高,另一方面,因为不带文件号的 Close 也可以实现关闭所有打开文件的功能。
相关阅读
Excel VBA 编程基础 -- 文件处理(一)
Excel VBA 编程基础 -- 文件处理(二)
Excel VBA 编程基础 -- 文件处理(三)