乐于分享
好东西不私藏

Excel VBA 编程基础 -- 现代文件处理(三)

Excel VBA 编程基础 -- 现代文件处理(三)
前面我们讨论了文件夹的创建、枚举与删除,今天继续讨论对文件夹的操作。
FSO.FolderExists
此方法用来判定指定的文件夹是否存在。其一般格式是:
FSO.FolderExists(folderspec)
其中,folderspec 是字符串表达式,指定要判定的文件夹。如果文件夹不在当前目录,则必须给出完整的路径。如果文件夹存在,则方法返回 True,否则返回 False。
FSO.CopyFolder
此方法用来将文件夹从一个地方拷贝到另一个地方。其一般格式是:
FSO.CopyFolder sourcedestination [, overwrite ]
其中,source 指定源文件夹,可以包含通配符(wildcards),表示拷贝多个文件夹。destination 指定拷贝的目的地。可选 Boolean 类型参数 overwrite 表示,如果源和目有相同的文件/文件夹,是否要用源文件/源文件夹覆盖目的文件/文件夹。True 表示覆盖,False 表示不覆盖,缺省是 True。
注:
  • FSO.CopyFolder 是递归式拷贝,意思是拷贝 source 文件夹以及所有子文件夹。
  • source 中的通配符只能作为路径的最后部分出现,不能出现于路径的中间部分。dest 中不允许使用通配符。
  • 关于通配符(wildcards),请参阅文末相关阅读中的《文件处理(二)》。
  • 如果拷贝过程中出现错误,FSO.CopyFolder 将停止拷贝,已拷贝部分不会撤回。
例1. FSO.CopyFolder 用法示例
图1 FSO.CopyFolder 用法示例
由右侧立即窗口的结果看,在拷贝之前,文件夹 C:\Test 不存在,拷贝之后,该文件夹存在。说明:如果拷贝之前,dest 指定的目的文件夹不存在,则 FSO.CopyFolder 会首先创建目的文件夹,然后再拷贝。
拷贝的结果如下:
图2 FSO.CopyFolder 拷贝结果
由这个结果可见,FSO.CopyFolder 是将 D:\VBA_files 文件夹里面的内容拷贝到指定的目的文件夹,而不是将 VBA_files 文件夹拷贝到目的地。在这个意义上,将 source 指定为 D:\VBA_files 和指定为 D:\VBA_files\* 是一样的。
但在 source 中使用还是不使用通配符,还是有区别的。看下面的例子。
例2. source 参数中使用通配符
图3 source 参数中使用通配符
例1 中的 source 没有使用通配符,目的文件夹在拷贝之前不存在,CopyFolder 方法先创建目的文件夹然后再拷贝。例2 的 source 使用了通配符,目的文件夹仍然在拷贝之前不存在。结果是:FSO.CopyFolder 不再创建目的文件夹,而是报告错误。
这就说明,如果在 source 参数中使用了通配符,则拷贝之前目的文件夹必须存在。
在看下面的例子。
例3. source 与 dest 的不同指定方式
图4 source 与 dest 的不同指定方式
在这个例子的第一次运行中,source 指定为 D:\VBA_filesX,这是一个不存在的文件夹,则不论 dest 指定的文件夹是否存在,FSO.CopyFolder 均失败。很显然,要拷贝文件夹,被拷贝的源文件夹必须存在。
第二次运行时,source 指定为 D:\VBA_files,这是一个已存在的文件夹。dest 改为 C:\Test\,此时目的文件夹 C:\Test 仍然不存在。则此时拷贝仍然失败!
在例1 中,dest = "C:\Test",对于这样指定的 dest,FSO.CopyFolder 会在拷贝前创建文件夹 Test。而对于例3 的 dest = "C:\Test\",则 FSO.CopyFolder 认为 C:\Test 已存在,如果不存在,则出错。
再看下面的例子。
例4. 与例1 不同的拷贝
图5 与例1 不同的拷贝
例4 与例1 基本相同,只有 dest 稍微有点不同:例4 的 dest 后缀以目录分隔符(\)。这样指定的 dest 要求拷贝之前目的文件夹必须存在。下面是运行结果:
图6 例4 的运行结果
对比图6 与图2,图2 是将 D:\VBA_files 文件夹里面的内容拷贝到 dest,图6 则是将 D:\VBA_files 文件夹拷贝到 dest!
再看下面的例子。
例5. 与例4 不同的拷贝
图7 与例4 不同的拷贝
本例与例4 唯一的不同,在于 source 使用了通配符。下面是运行结果:
图8 例5 的运行结果
由这个结果可以看出,如果 dest 后缀以路径分隔符,则只拷贝文件夹。
总结上面例1 - 例5 所展示的情况,可以将 FSO.CopyFolder 按照 source 中使用还是不使用通配符分为两大类:
  • source 中使用通配符:表示拷贝的是 source 文件夹里面的内容,此时要求 dest 必须存在,根据 dest 的指定方式分为两种情况:
    • dest 后缀以路径分隔符(\),则只拷贝 source 文件夹中的子目录及子目录中的内容。
    • dest 无后缀路径分隔符,则拷贝 source 文件夹中的所有内容。
  • source 中不使用通配符:此时根据 dest 的指定方式分两种情况:
    • dest 后缀以路径分隔符(\),将 source 整个文件夹拷贝到 dest,但要求 dest 必须存在。
    • dest 无后缀路径分隔符,此时拷贝 source 文件夹中的所有内容,但不要求 dest 必须存在。
相关阅读
Excel VBA 编程基础 -- 现代文件处理(一)
Excel VBA 编程基础 -- 现代文件处理(二)
Excel VBA 编程基础 -- 文件处理(二)