乐于分享
好东西不私藏

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

Excel VBA 编程基础 -- 文件处理(二)
今天我们继续讨论 VBA 中的文件处理功能。
Basic 语言中的文件处理功能,因为兼容性的考虑,现在被 VBA 全盘继承。在讨论之前,为了参考方便,还是把 VBA 继承自 Basic 的文件处理工具继续转贴如下:
表1 VBA 早期的文件处理工具
上文我们讨论了其中对文件夹(目录)的操作,今天我们来看如何操作目录中的文件。
Dir
Dir 搜索指定的目录,返回匹配的文件或目录。其一般格式是:
Dir [ (pathname [, attributes ]) ]
其中,pathname 是字符串表达式,指定要搜索的文件名。pathname 中可以包含驱动器、目录。如果 Dir 没找到要搜索的目标,则返回空字符串。可选参数 attributes 是常量或数值表达式,指定要搜索目标所需满足的条件。如果省略 attributes,则搜索时不考虑目标的性质。
attributes 的取值及意义列于下表:
表2 attributes 的取值及意义
注意:attributes 一直使用的是复数,表明上表所列的 attribute 可以相加组合为一种更为复杂的条件。
Dir 可以用来枚举,首先使用带参数的 Dir 来初始化枚举过程,然后在循环中使用无参数的 Dir 来获取枚举列表中后面的目标。
例1. Dir 用法举例
图1 Dir 用法示例
首先,我们看到,图中 Dir 的参数 attributes 就是一个属性组合,要求 Dir 列举具有如下属性的目标:
  1. vbNormal:具有正常属性的目标
  2. vbHidden:具有隐藏属性的目标
  3. vbSystem:具有系统属性的目标
  4. vbDirectory:目录
这些属性组合在一起,就表示要求 Dir 列举具有正常属性或隐藏属性或系统属性的目录或文件。从右侧立即窗口的美剧结果可以看出,驱动器 C 根目录下满足这些枚举条件的目标(文件或目录)有 19 个。
注:VBA 中的 Dir 和 Windows 的 Dir 是不一样的。VBA 中的 Dir,vbNormal 是必须的,不管你是否包含了这个属性。另外,如果指定 vbDirectory,则枚举项将包含目录,如果不指定,则只包含文件。也就是说,VBA 中的 Dir,文件其是必须的枚举目标。对于 Windows 的 Dir,如果指定了枚举目录,则枚举目标将只包含目录。
下面是与图1 中的 attributes 等价的 Dir,可以看出,其枚举结果与图1 是不同的:
图2 Windows Dir
图中 Dir 的参数解释如下:
  • /A:H:指示 Dir 枚举隐含目标
  • /A:S:指示 Dir 枚举系统目标
  • /A:D:指示 Dir 枚举的目标是目录
所以,/A:H /A:S /A:D 三参数组合的结果就等于 vbHidden + vbSystem + vbDirectory。虽然逻辑上等价,但因为参数在各自 Dir 中的作用不同,导致其枚举结果也就不同。
仔细考究就会发现,/A:D 在 Windows Dir 中具有排他性,即指定 /A:D 就表示只枚举目录,通常情况下只枚举普通目录,但因为加上了 /A:H 和 /A:S,则隐含目录和系统目录也成为了枚举目标。
而 VBA 中的 Dir,vbNormal 和文件是 Dir 必须的枚举目标,其他的 attributes 只是对这个“必须目标”的补充,而非排他。譬如,加上 vbDirectory,只是表示将目录也列入枚举目标,而非将目录作为唯一的枚举目标。
Kill
Kill 用来删除文件。其一般格式是:
Kill pathname
其中,pathname 是字符串表达式,指定要删除的文件。pathname 可以包含驱动器和目录。pathname 中还可以包含诸如星号(*)和问号(?)这些通配符(wildcards),从而可以一次性删除多个文件。如果 pathname 指定的文件不存在,则会引发“文件未找到”错误。
所谓通配符(wildcard),是指一种特殊符号,用来在模式匹配、搜索以及过滤操作中表示一个或多个符号。常用的通配符有以下几种:
  • 星号(*):匹配零个或多个字符。譬如,comp* 将匹配 "comp"、"computer"、"complete" 等。
  • 问号(?):只匹配一个字符。譬如,c?mp 将匹配 "comp"、"camp" 等。
  • 方括号([]):匹配方括号中所包含的字符类中的一个字符。譬如,[a-z] 将匹配 "a"、"d"、"x" 等。
  • 百分号(%):主要用于 SQL 语言,作用与上面的星号(*)相同。
例1. Kill 用法示例
图3 Kill 用法示例
由图可见,原来 D:\VBA_file 目录下有三个文件,Kill 一次性删除了所有文件名匹配 file?.txt 的文件,也就是 file1.txt 和 file2.txt。因此,Kill 之后,D:\VBA_file 目录下就只有一个 data.txt 文件了。
所以,在使用 Kill 删除文件时要小心:通配符的威力强大无比,要谨慎。
注:
  1. Kill 只能删除文件,要删除目录,请参见《文件处理(一)》中讨论的 RmDir。
  2. Kill 不能删除只读文件,若给 Kill 指定了只读文件,则会引发“路径/文件访问错误”。
Windows 提供了 DEL / ERASE 命令用来删除文件,功能比 VBA 的 Kill 语句要强大得多。带有 /F 参数的 DEL 命令可以用来删除只读文件,如下图所示:
图4 Windows DEL 命令删除只读文件
D:\VBA_file 下的 data.txt 文件被设置为只读,在使用 VBA Kill 删除该文件时发生错误。由图4 可以看到,Del 在执行 /F data.txt 时没有显示任何信息,表示命令成功执行,接下来用 Dir 验证,证明 D:\VBA_file 目录下已经没有任何内容。
相关阅读
Excel VBA 编程基础 -- 文件处理(一)