Excel VBA 编程基础 -- 现代文件处理(一)从今天开始我们讨论 VBA 中借由 Microsoft Scripting Runtime 提供的现代版文件处理工具。首先,需要添加对 Microsoft Scripting Runtime 的引用。在 VBE 中,点击“工具” -> “引用”,会弹出引用对话框,在“可使用的引用”列表框中,找到 Microsoft Scripting Runtime,勾选复选框,如图所示:图1 添加 Microsoft Scripting Runtime 引用然后,在 VBE 中,点击“视图” -> “对象浏览器”,按按下 F2 快捷键,打开对象浏览器,在列表框中选择 Scripting,可以看到 Microsoft Scripting Runtime 提供的所有对象,如图2 所示:图2 Scripting 中的所有对象可以看到,Scripting 中,除了字典 Dictionary 对象之外,几乎全部是与文件处理有关的对象:驱动器 Drive / Drives、文件夹 Folder / Folders、文件 File / Files,最主要的就是 FileSystemObject 对象,简称 FSO。FileSystemObjectFileSystemObject 提供了对文件系统的访问工具。我们首先来看 FSO 中的 Drives 属性。FSO.Drives 属性FSO 中的 Drives 属性返回系统中所有驱动器的集合。由此我们可以枚举该集合,从而获得系统中所有驱动器的信息。Drive 对象Drive 对象没有方法,只有一些属性表示该驱动器的所有信息。Drive 对象的属性列表如下:表1 Drive 属性列表注:表中的 AvailableSpace 和 FreeSpace 一般说来是相同的,但如果驱动器使用了配额限制(quota),则 AvailableSpace 和 FreeSpace 就不同了。尽管 VBA 文档没有进一步说明,但应该是:AvailableSpace 表示在配额限制下还有多少可用空间。驱动器类型 DriveType 是一个 1 - 5 的整型数,表示可移动的介质(Moveable)还是固定介质(Fixed),是网络共享还是 CD-ROM 等等。文件系统类型 FileSystem 是字符串类型,表示该驱动器的文件系统是 FAT32、NTFS 还是其他。下面的例子演示了如何使用 Drive 对象的属性。例1. Drive 属性用法示例图3 Drive 属性用法示例由于我们已经引用了 Microsoft Scripting Runtime,因此可以使用早绑定(early binding)的方式声明/创建 FileSystemObject 类型的对象。本例的核心是使用 For Each ... Next 循环枚举 FSO 的 Drives 集合,然后针对每一个 Drive 对象,列出其所有属性信息。右侧的立即窗口显示了我的机器上各个驱动器的信息。下面是序列号格式化函数 FormatSerialNumber 的代码:图4 FormatSerialNumberDrive 对象的 SerialNumber 属性是一个整型数,首先转换为十六进制的字符串形式,然后进行格式化。因为驱动器的序列号是以 ABCD-WXYZ 的形式显示的,所以格式化就是对十六进制字符串进行分组并以短横线(-)分隔。FSO.GetDriveName 方法根据指定的路径返回该路径所在的驱动器名称。其一般格式是:FSO.GetDriveName(path)其中,path 表示包含驱动器的路径。GetDriveName 返回该路径所在驱动器的名称。如果无法确定驱动器,则返回空字符串("")。FSO.GetDrive 方法根据驱动器名称返回驱动器对象。其一般格式是:FSO.GetDrive(drivespec)其中,drivespec 是驱动器字母(C),或驱动器字母加冒号(C:),或驱动器字母加冒号加路径分隔符(C:\),或者网络共享名称(\\computer2\sharename1)。如果想通过路径来获取所在的驱动器对象,则应该先使用 GetDriveName 获取驱动器名称,然后再使用 GetDrive 获取驱动器对象,即使用如下的调用序列:driveObj = FSO.GetDrive(FSO.GetDriveName(path))具体用法见下面的例子。例2. GetDrive / GetDriveName 用法示例图5 GetDrive / GetDriveName 用法示例从上面对 FSO 中有关驱动器的简单介绍中可以看出,现代版的文件处理工具比 VBA 继承自 Basic 早期的文件处理工具要好用得多:通过属性获取对象集合,利用 For Each ... Next 循环枚举集合中的对象,通过调用对象方法来实现某种功能,等等。而且,本地驱动器和网络共享资源通过 Drive 对象实现了统一,大大简化了人们的编程工作。这就是面向对象编程(OOP)带给人们的好处。