从0学Excel VBA编程 · 番外篇2:FileSystemObject(FSO)——批量管文件、建文件夹的利器
- 2026-09-19 20:40:05
从0学Excel VBA编程 · 番外篇2:FileSystemObject(FSO)——批量管文件、建文件夹的利器
学习目标
搞懂 FSO 是什么,以及它管"文件夹 / 文件 / 文本"的三大对象 掌握 FSO 的常见招式:判断存在、创建、复制、遍历、读写文本 通过 3 个实战案例,把 FSO 用到批量建目录、列文件清单、读写配置文件上
知识点精讲
前面我们用过 Dir 判断文件夹是否存在、MkDir 建文件夹(第 11 篇),但 Dir 只能"看名字",拿不到文件大小、修改时间,也不能方便地遍历一个文件夹里的所有文件。
FileSystemObject(简称 FSO) 就是 VBA 里的"文件大管家",它能更结构化地操作磁盘上的文件夹和文件。你可以把它理解成一个"全能行政":
管文件夹:建、查、删、复制、遍历; 管文件:复制、移动、改名、删、取属性(大小、修改时间、后缀名); 管文本内容:读、写 .txt / .csv / .ini等文本文件。
第一步:请出这位大管家(一行搞定,无需任何设置):
Dim fso As ObjectSet fso = CreateObject("Scripting.FileSystemObject")FSO 内部有 3 个核心对象,记住它们就懂了骨架:
| Folder | fso.GetFolder(路径).Files 遍历里面所有文件 | |
| File | .Name.Size 大小、.DateLastModified 修改时间、.GetExtensionName 后缀 | |
| TextStream | fso.OpenTextFileCreateTextFile 得到,用 .ReadLine / .WriteLine 读写 |
FSO 最常用的方法(先判断再动手,是铁律):
FolderExists(路径)/FileExists(路径):存在吗?(True/False)CreateFolder(路径):建文件夹CopyFile 源, 目标/MoveFile/DeleteFile:复制 / 移动 / 删除文件GetFolder(路径).Files:拿到文件夹里所有文件的集合,配合For Each遍历OpenTextFile(路径, 模式, 是否新建):开一个文本通道。模式:1=读、2=写(覆盖)、8=追加BuildPath(文件夹, 文件名):自动用反斜杠把路径拼好,不怕写错分隔符
FSO 适合处理哪些文件类型?
.txt.log | ||
.csv | Split 拆列 | |
.ini.cfg | key=value | |
.xlsx.xlsm | FileExistsCopyFile 管文件;要读内容用 Workbooks.Open(第 11 篇) | |
.zip |
小提醒:FSO 是"文件管理员",不是"Excel 操作员"。要新建、打开、改 Excel 内容,还是用我们第 10、11 篇学的
Worksheets/Workbooks;FSO 负责"这个文件在不在、复制到哪、叫什么名"。
3 个实战案例
案例 1(简单):一键批量建 12 个月文件夹
功能说明:在当前工作簿旁边建一个"按月归档"文件夹,里面再建 2026-01 到 2026-12 共 12 个子文件夹。每月归档资料直接拖进去,再也不用手动新建。
操作步骤:
按 Alt + F11打开 VBA 编辑器,插入一个「标准模块」。粘贴下面代码。 运行"一键建12个月文件夹"。 去工作簿所在目录,会看到"按月归档"及 12 个月文件夹已建好。
Sub 一键建12个月文件夹() Dim fso As Object Dim 根目录 As String, 月文件夹 As String Dim 月 As Integer Set fso = CreateObject("Scripting.FileSystemObject") 根目录 = ThisWorkbook.Path & "\按月归档" ' 根目录不存在就先建(先判断再动手) If Not fso.FolderExists(根目录) Then fso.CreateFolder 根目录 End If For 月 = 1 To 12 月文件夹 = fso.BuildPath(根目录, "2026-" & Format(月, "00")) If Not fso.FolderExists(月文件夹) Then fso.CreateFolder 月文件夹 End If Next 月 MsgBox "已在:" & vbCrLf & 根目录 & vbCrLf & "下建好 12 个月文件夹。", vbInformationEnd Sub要点:
BuildPath自动用反斜杠拼接路径,比手拼& "\"更稳;FolderExists先判断,重复运行也不会报错。
案例 2(中等):一键列出某文件夹里所有文件(名称/大小/修改时间)
功能说明:把某个文件夹里的所有文件清单(文件名、大小 KB、修改时间)列到工作表里。比 Dir 强大的是,能直接拿到文件大小和修改时间,做文件盘点超方便。
操作步骤:
在标准模块粘贴下面代码(可与案例 1 同模块)。 运行"一键列出文件夹所有文件"。 看 A:C 列,已列出当前工作簿所在目录下的全部文件及属性。
Sub 一键列出文件夹所有文件() Dim fso As Object Dim 目标文件夹 As Object, 文件 As Object Dim 行号 As Long Set fso = CreateObject("Scripting.FileSystemObject") Set 目标文件夹 = fso.GetFolder(ThisWorkbook.Path) ' 取当前工作簿所在目录 Cells.Clear Range("A1").Value = "文件名" Range("B1").Value = "大小(KB)" Range("C1").Value = "修改时间" Range("A1:C1").Font.Bold = True 行号 = 2 For Each 文件 In 目标文件夹.Files Cells(行号, 1).Value = 文件.Name Cells(行号, 2).Value = Round(文件.Size / 1024, 1) ' 字节转KB,保留1位 Cells(行号, 3).Value = 文件.DateLastModified 行号 = 行号 + 1 Next 文件 MsgBox "共列出 " & (行号 - 2) & " 个文件。", vbInformationEnd Sub要点:
GetFolder(...).Files拿到文件集合,用For Each遍历;文件.Name / .Size / .DateLastModified直接取属性。想只看某种类型,可加If LCase(fso.GetExtensionName(文件.Name)) = "xlsx" Then过滤。
案例 3(实用小案例):用 FSO 读写配置文件,记住你的"默认设置"
功能说明:很多办公小工具需要记住一个"默认备份路径"或"默认用户"。用 FSO 写一个 config.txt 配置文件(格式 键=值),下次运行自动读取,不用每次改代码。这正是配置文件的典型用法。
操作步骤:
粘贴下面两段代码到标准模块(它们是一个小整体)。 先运行"保存备份路径到配置",生成 config.txt。再运行"读取配置并备份",它会从 config.txt读出备份路径并提示你(真正备份时可接第 11 篇的SaveAs)。
' 子过程1:把设置写进配置文件Sub 保存备份路径到配置() Dim fso As Object Dim 配置 As Object Dim 配置文件 As String Set fso = CreateObject("Scripting.FileSystemObject") 配置文件 = ThisWorkbook.Path & "\config.txt" ' 模式 2 = 写(覆盖);最后一个 True = 文件不存在就新建 Set 配置 = fso.OpenTextFile(配置文件, 2, True) 配置.WriteLine "BackupPath=" & ThisWorkbook.Path & "\备份" 配置.WriteLine "LastUser=西哥" 配置.Close MsgBox "配置已写入:" & vbCrLf & 配置文件, vbInformationEnd Sub' 子过程2:从配置文件读出设置Sub 读取配置并备份() Dim fso As Object Dim 配置 As Object Dim 配置文件 As String, 行 As String Dim 键 As String, 值 As String, 备份路径 As String Set fso = CreateObject("Scripting.FileSystemObject") 配置文件 = ThisWorkbook.Path & "\config.txt" If Not fso.FileExists(配置文件) Then MsgBox "还没配置文件,请先运行『保存备份路径到配置』。", vbExclamation Exit Sub End If Set 配置 = fso.OpenTextFile(配置文件, 1) ' 模式 1 = 读 Do While Not 配置.AtEndOfStream 行 = 配置.ReadLine If InStr(行, "=") > 0 Then 键 = Split(行, "=")(0) ' 等号左边 值 = Split(行, "=")(1) ' 等号右边 If 键 = "BackupPath" Then 备份路径 = 值 End If Loop 配置.Close If 备份路径 <> "" Then MsgBox "从配置读到的备份路径:" & vbCrLf & 备份路径, vbInformation ' 这里就可以用 备份路径 去执行真正的备份(如 SaveAs) Else MsgBox "配置里没有 BackupPath。", vbExclamation End IfEnd Sub要点:
OpenTextFile(路径, 2, True)写、OpenTextFile(路径, 1)读;Split(行, "=")把一行按等号拆成"键"和"值";InStr(行, "=")判断这行是不是键=值格式。这就是.ini/.cfg配置文件的标准读写套路,几乎所有小工具都这么存设置。
本篇小结
FSO = 文件大管家:用 CreateObject("Scripting.FileSystemObject")一行请出来,管文件夹、文件、文本三件事。三大核心对象:Folder(文件夹)、File(文件属性)、TextStream(读写文本)。 铁律:先 Exists判断,再Create/Copy/Open,避免报错。文件类型分两类处理: .txt/.csv/.ini等文本用 TextStream 直接读写;.xlsx等 Excel 文件 FSO 只管"文件管理",读内容还得用Workbooks.Open。配置文件( .ini/config.txt)就是"键=值"文本,用OpenTextFile+Split即可读写,是办公小工具记住设置的标配做法。
下一篇内容预告
本篇是《从0学Excel VBA编程》番外篇2。FSO 让你真正"走出 Excel、接管整个文件夹"。下一篇可选:
番外篇3:在 VBA 里用 SQL——直接对表格写 SELECT做汇总,比循环清爽;或 番外篇3:FSO + Excel 实战——批量把某文件夹里所有 Excel 的内容合并/提取(FSO 遍历 + Workbooks.Open 配合)。 需要哪个,告诉我就行。