news 2026/9/2 9:00:52

【Excel VBA 编程】第80讲:文件夹操作的“十八般武艺

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Excel VBA 编程】第80讲:文件夹操作的“十八般武艺

FSO(File System Object,文件系统对象)是微软提供的一个“工具箱”,它能让我们的VBA程序像手动操作电脑一样,去创建、删除、移动、复制文件和文件夹,还能查看文件信息(比如名字、大小、修改日期)和检查硬盘空间

因为它功能强大,内容也比较多,所以我会分成几期来详细讲解,本期重点介绍如何通过FSO操作文件夹

创建

CreateFolder方法用于创建一个新的文件夹,其语法:

object.CreateFolder(foldername)

一个简单的应用,在路径D:\常用文件下创建一个名为tmp的文件夹

Dim fso As ObjectSet fso = CreateObject("Scripting.FileSystemObject")fso.CreateFolder ("D:\常用文件\tmp")

以上代码首先声明了一个名为 fso 的变量,其类型为 Object;接着使用 CreateObject 函数创建了一个“Scripting.FileSystemObject”对象的实例,并将其赋值给之前声明的 fso 变量;最后调用了 fso 对象的 CreateFolder 方法创建文件夹

但是,一般为了避免因重复创建而导致的错误,在创建文件夹前,我们通常会先用 FolderExists 方法检查是否存在,因此完整的代码为:

Dim fso As ObjectSet fso = CreateObject("Scripting.FileSystemObject")If Not fso.FolderExists("D:\常用文件\tmp") Thenfso.CreateFolder ("D:\常用文件\tmp")ElseMsgBox "文件夹已存在"End If

VBA内置的MkDir命令只能创建单级文件夹,且父文件夹必须存在。同样,FSO的CreateFolder方法本身也不能直接创建多级目录因此,创建任意多层文件夹需要额外的逻辑

关于创建多层文件夹,其实基于目前的编程技能,相信大家一定有自己的创建逻辑。当然如果没有头绪也不着急,后续也会分享相关的内容

删除

DeleteFolder方法用于在文件系统中永久移除指定路径的文件夹及其所有子项(包括子文件夹和文件),它是一个无差别删除方法,操作范围涵盖空文件夹和非空文件夹的结构清理

换句话说,DeleteFolder方法会自动递归遍历并删除指定文件夹内的所有层级子目录及文件,无需我们编写额外的递归逻辑代码。这意味着无论文件夹结构多深、内容多少,一次调用即可完成清理

重要提醒:DeleteFolder 方法是永久性删除,不会将文件移入回收站。一旦执行,数据无法通过常规方法恢复,因此,在使用时一定要谨慎

使用方法一,删除指定的文件夹

Dim fso As ObjectSet fso = CreateObject("Scripting.FileSystemObject")Dim folderPath As StringfolderPath = "D:\常用文件\tmp"' 在执行删除前,先检查文件夹是否存在If fso.FolderExists(folderPath) Thenfso.DeleteFolder folderPath, TrueMsgBox "文件夹删除成功!"ElseMsgBox "指定的文件夹不存在。"End IfSet fso = Nothing

由于DeleteFolder方法的完整语法是

object.DeleteFolder(folderspec, [force])

第二个参数 force 是可选的布尔值,默认值为 False。这意味着,如果文件夹或其内容被设置为只读,删除操作将失败

因此,要强制删除包含只读文件的文件夹,必须将 force 参数显式设置为 True

使用方法二,使用通配符(*?)批量删除

fso.DeleteFolder "D:\常用文件\Backup_*", True

需要注意,通配符仅允许在路径的最后一级目录名中使用,以上代码将匹配所有以“Backup_”开头的子文件夹,并将其全部删除

复制与移动

3.1复制

CopyFolder方法是FileSystemObject对象提供的编程接口,用于将指定源文件夹(及其内部所有内容)完整地复制到目标位置。与简单的文件复制不同,此方法会自动处理文件夹的层级结构,实现“递归复制”,即复制源文件夹本身以及其包含的所有子文件夹和文件

语法如下:

object.CopyFolder source, destination[, overwrite]

前两个参数都好理解,重点看第3个参数overwrite:为可选参数,布尔值(Boolean),指示当目标位置已存在同名文件夹或文件时是否覆盖。默认值为True(覆盖)。设置为False时,如果遇到已存在的项目,操作将因错误而中断

例如,将D:\常用文件\SourceFolder复制到D:\Backups\CopiedFolder下,如果CopiedFolder存在则覆盖

Dim fso As ObjectSet fso = CreateObject("Scripting.FileSystemObject")Dim sourcePath As String, destPath As StringsourcePath = "D:\常用文件\SourceFolder"destPath = "D:\Backups\CopiedFolder"' 执行复制,True表示覆盖已存在的文件fso.CopyFolder sourcePath, destPath, True

当然,sourcePath也可以使用通配符*或者?,如

sourcePath = "D:\常用文件\Backup_*"

用以实现批量复制多个符合模式的文件夹,但是destPath不可以使用通配符,这一点也是很好理解的,不再赘述

3.2 移动

MoveFolder方法用于将一个或多个文件夹从一个位置移动到另一个位置,其语法为:

object.MoveFolder source, destination

其中,

  • source:要移动的一个或多个文件夹的路径字符串。关键点:路径字符串只能在最后一个部分(即文件夹名部分)包含通配符(如 * 或 ?),用于批量移动匹配的文件夹

  • destination:文件夹要移动到的目标路径。重要限制:此参数不能包含通配符

关于通配符的使用与CopyFolder方法是一致的,可以参考借鉴CopyFolder方法

例如,以下两行代码,destination参数结尾不同,一个有反斜线一个没有,这在执行过程中有何不同呢?

代码1:

fso.MoveFolder "D:\常用文件\SourceFolder", "D:\Backups\CopiedFolder"

代码2:

fso.MoveFolder "D:\常用文件\SourceFolder", "D:\Backups\CopiedFolder\"

代码1中destination 参数结尾无分隔符(\),系统会认为 destination 是要创建的新文件夹的名称,移动操作会以此名称创建目标文件夹。假如此时目标文件CopiedFolder存在,则执行会报错了

而代码2中destination 参数以路径分隔符(\)结尾,那么系统会认为 destination 是一个已经存在的文件夹,匹配的源文件夹将被移动到这个目标文件夹内

因此,初次使用时一定要留心,别把自己整郁闷了

遍历

GetFolder方法会返回一个对应的Folder对象实例,通过 GetFolder 获取Folder对象后,可访问其 Files 集合(获取所有文件)和 SubFolders 集合(获取所有子文件夹)进行遍历

例如,获取Folder对象并访问属性

获取Folder对象后,可以访问其丰富的属性来获取文件夹的详细信息

Dim fso As Object, fld As ObjectSet fso = CreateObject("Scripting.FileSystemObject")Dim folderPath As StringfolderPath = "D:\常用文件"' 使用GetFolder方法获取Folder对象Set fld = fso.GetFolder(folderPath)' 访问Folder对象的属性MsgBox "文件夹名称: " & fld.Name & vbCrLf & _"完整路径: " & fld.path & vbCrLf & _"父文件夹: " & fld.ParentFolder & vbCrLf & _"创建日期: " & fld.DateCreated & vbCrLf & _"最后修改日期: " & fld.DateLastModified & vbCrLf & _"最后访问日期: " & fld.DateLastAccessed & vbCrLf & _"文件夹类型: " & fld.Type & vbCrLf & _"是否为根目录: " & fld.IsRootFolder, _vbInformation, "文件夹信息"

执行后结果显示如下

建议:由于GetFolder方法在路径无效时会抛出错误,因此在实际使用中,强烈建议先使用FolderExists方法验证路径的有效性

当然,GetFolder方法应用不仅仅以上内容,还有更高级用法,后续也会慢慢分享给大家

结束语

最后,记得使用完fso后,要用Set fso = Nothing释放掉哈,养成好习惯

好了,今天的分享就到这里了,咱们下期继续

公众号同时也在不间断地分享免费的编程案例,如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想提升自我,都可以关注我的公众号“努力鸭是黑色的”,解锁更多的VBA技能

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 20:04:26

MYSQL的第一次

目录 前情提要 题目解析 连接并使用数据库 创建employees表 创建orders表? 创建invoices表?? ?查看建立的表 前情提要 需要下载mysql并进行配置,建议下载8.0.37,详情可见MySQL超详细安装配置教程(亲测有效)_mysql安装教程-CSDN博客 题目解析…

作者头像 李华
网站建设 2026/9/2 22:15:00

Sambert-HifiGan语音合成服务的灰度发布方案

Sambert-HifiGan语音合成服务的灰度发布方案 引言:中文多情感语音合成的业务需求与挑战 随着智能客服、有声阅读、虚拟主播等AI应用场景的普及,高质量的中文多情感语音合成(Text-to-Speech, TTS) 成为提升用户体验的关键能力。传统…

作者头像 李华
网站建设 2026/8/31 0:39:32

Sambert-HifiGan与语音克隆技术结合:打造个性化语音助手

Sambert-HifiGan与语音克隆技术结合:打造个性化语音助手 引言:中文多情感语音合成的现实需求 随着智能语音助手、虚拟主播、有声读物等应用的普及,用户对语音合成(Text-to-Speech, TTS)系统的要求已从“能说”转向“…

作者头像 李华
网站建设 2026/8/25 18:32:26

Typing打字训练平台官方使用指南

在众多Typing打字训练平台中,要找到一款适合中文用户、能高效提升中文打字能力的网站并不容易。而哪吒打字作为专为中文用户打造的打字学习平台,在这方面表现出色,尤其适合中小学生系统提升打字技能,接下来就为大家详细介绍它的使…

作者头像 李华
网站建设 2026/9/2 21:23:24

电商客服语音定制:用Sambert-Hifigan生成促销播报,转化率提升20%

电商客服语音定制:用Sambert-Hifigan生成促销播报,转化率提升20% 引言:情感化语音合成如何重塑电商营销体验 在当前的电商竞争环境中,用户体验的细微差异往往决定转化成败。传统自动化客服多采用机械、单调的语音播报,…

作者头像 李华