news 2026/2/19 4:33:41

【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/2/1 8:30:58

2026企业建站核心流程指南

企业建站是一项系统工程,科学有序的流程是保障建站效率与效果的关键。实践中,可遵循“需求定位→建站方式选型→搭建配置→上线运维”的核心流程分步推进,这一流程形成了从前期规划到后期运营的完整闭环,既能避免盲目建站导致的需…

作者头像 李华
网站建设 2026/2/19 3:08:32

基于STM32的红外遥控控制系统技术_366

文章目录 一、前言 1.1 项目介绍 【1】项目开发背景 【2】设计实现的功能 【3】项目硬件模块组成 【4】设计意义 【5】国内外研究现状 【6】摘要 1.2 设计思路 1.3 系统功能总结 1.4 开发工具的选择 【1】设备端开发 【2】OneNet平台 1.5 参考文献 1.6 系统框架图 1.7 系统原理…

作者头像 李华
网站建设 2026/2/15 12:16:39

虚拟串口软件模拟多设备通信:深度剖析机制

一台电脑模拟整条工业总线?揭秘虚拟串口如何“无中生有”构建多设备通信系统你有没有遇到过这样的场景:调试一个Modbus主站程序,却只有单个从设备可用;想验证轮询逻辑,但手头缺了另外两个传感器模块;团队多…

作者头像 李华
网站建设 2026/2/8 19:24:41

在 RAP 里做文件上传 - 用 Stream 把 Excel 与图片自然融入业务对象

企业应用做到一定深度,Excel 模板、图片凭证、合同 PDF、产品主图这类文件几乎绕不开。用户希望在同一个业务对象里完成维护,不想跳转到外部网盘,也不想再学一套附件系统的操作。ABAP RESTful Application Programming Model (RAP) 给了一个相对优雅的答案: 用 OData 的 Str…

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

在 RAP 里玩转 Events:从触发到消费的端到端实践

引子:为什么把 Excel 导入做成事件驱动 在企业应用里,RAP 的一个常见场景是:用户在 Fiori 上点一个动作,把 Excel 数据导入到业务对象里。导入成功之后,往往还要做一串后续动作:发通知、触发校验、推送到接口、记录审计、启动审批,甚至把结果同步到别的系统。 如果把这…

作者头像 李华