经过前几期的学习,我们对FSO有了初步的认识,掌握了管理文件夹和文件的基本方法
接下来就来运用这些知识,解决一个实际工作中常会遇到的问题——如何一次性地创建出多层嵌套的文件夹结构,也就是“级联创建文件夹

何为级联创建
级联创建文件夹”就是指当我们需要创建一个路径很深的文件夹,如:

即使上述路径中间的一些上级文件夹(如“12月”、“报告”)不存在,程序也能自动把它们一并创建出来,而不是因为路径不存在就报错
其本质还是创建文件夹,那么,我们就需要回顾一下,使用FSO的哪一方法才能创建文件夹呢?当然是CreateFolder,忘记的小伙伴可以点击链接查看原文:【Excel VBA 编程】第80讲:文件夹操作的“十八般武艺
前文也提到过CreateFolder方法只能创建单级文件夹,且父级文件夹必须存在。这句话的意思是说,如果我们要创建一个名为“初稿”的文件夹,那么必须保证其上的“报告”、“12月”、“2025年”及“项目”文件夹都必须存在
最行之有效的方法是在代码中连续调用5次CreateFolder方法,如下
Dim fso As ObjectSet fso = CreateObject("Scripting.FileSystemObject")fso.CreateFolder ("D:\项目")fso.CreateFolder ("D:\项目\2025年")fso.CreateFolder ("D:\项目\2025年\12月")fso.CreateFolder ("D:\项目\2025年\12月\报告")fso.CreateFolder ("D:\项目\2025年\12月\报告\初稿")
上述代码逻辑直观,易于理解和调试。当然缺点也和优点一样明显:一次性买卖,无法复用
因此,想要在代码复用、应对需求变化的前提下创建任意多层文件夹就需要额外的逻辑:一种是自顶向下逐级创建,另一种是自底向上创建
既然我们希望这段代码能在不同的地方重复使用,所以把两种实现方式都分别打包成了独立的函数。这样一来,无论在什么场景下需要用到它们,都可以直接调用,非常方便

自顶向下逐级创建
这种方法从路径的根目录开始,沿着路径的层级顺序,逐级判断并创建文件夹。其逻辑清晰,易于理解,是较为直观的实现方式,代码参考:
Function CreateMultiLevelFolder(ByVal folderPath As String) As BooleanOn Error GoTo ErrorHandlerDim fso As ObjectSet fso = CreateObject("Scripting.FileSystemObject")' 1. 标准化路径folderPath = Trim(folderPath)folderPath = Replace(folderPath, "/", "\")If Right(folderPath, 1) = "\" Then folderPath = Left(folderPath, Len(folderPath) - 1)' 2. 检查路径是否有效If folderPath = "" ThenMsgBox "路径为空!", vbCriticalCreateMultiLevelFolder = FalseExit FunctionEnd If' 3. 分割路径并逐级创建Dim pathParts() As StringDim currentPath As StringDim i As IntegerpathParts = Split(folderPath, "\")currentPath = pathParts(0) & "\" ' 初始化,如 “D:\”For i = 1 To UBound(pathParts)currentPath = currentPath & pathParts(i) & "\"' 如果当前级文件夹不存在,则创建If Not fso.FolderExists(currentPath) Thenfso.CreateFolder currentPathEnd IfNext i' 4. 最终确认创建成功If fso.FolderExists(folderPath) ThenCreateMultiLevelFolder = TrueElseCreateMultiLevelFolder = FalseEnd IfSet fso = NothingExit FunctionErrorHandler:MsgBox "创建文件夹时出错:" & Err.Description, vbCriticalCreateMultiLevelFolder = FalseSet fso = NothingEnd Function
CreateMultiLevelFolder函数说明:
-
函数实现功能:自顶向下逐级创建多级目录
-
参数:folderPath指需要创建的完整文件夹路径
-
返回值:成功创建返回True,失败返回False
为了验证CreateMultiLevelFolder的功能,我们可以写一段简单的测试代码:
Sub Test()Dim targetPath As StringtargetPath = " D:\项目\2026年\第一季度\1月\报告\初稿\"If CreateMultiLevelFolder(targetPath) ThenMsgBox "目录创建成功!", vbInformationEnd IfEnd Sub
执行Test后会自动创建多级目录,结果如下:


自底向上创建
这种方法更高效,尤其适合路径中大部分中间目录都不存在的情况,但是逻辑复杂度稍高,需要理解反向创建逻辑
例如,还是这个路径“D:\项目\2025年\12月\报告\初稿”,整个过程如下:
-
从目标路径开始检查:首先检查最末端的完整路径“D:\项目\2025年\12月\报告\初稿”是否存在。如果不存在,则将其完整路径记录到一个数组中
-
向上回溯一级:然后,获取上一步路径的父目录,即 “D:\项目\2025年\12月\报告”,并检查它是否存在。如果不存在,同样将其记录到数组中
-
循环回溯与记录:重复上述“检查-记录-获取父目录”的步骤。接下来会依次检查“”D:\项目\2025年\12月”、“D:\项目\2025年”等路径
-
终止条件:这个循环会一直进行,直到遇到一个已经存在的目录(例如 D:\项目),或者追溯到根目录(如 D:\)仍不存在为止。此时,数组中就按顺序记录了从目标路径开始,所有不存在的、需要创建的目录路径
而反向创建目录则是将记录不存在的路径的数组倒序循环,需要从最顶层的缺失目录开始创建(即数组的最后一个元素,离根目录最近),依次向下创建到目标目录(数组的第一个元素)
搞清楚了以上逻辑,再阅读如下参考代码就容易理解了
Sub ReversedCreateFolder(ByVal folderPath As String)Dim fso As ObjectDim arr() As StringDim tempPath As StringDim i As IntegerDim count As IntegerSet fso = CreateObject("Scripting.FileSystemObject")' 1. 标准化路径folderPath = Replace(folderPath, "/", "\")' 2. 查找首个存在的父目录,并记录缺失路径tempPath = folderPathcount = 0Do While Not fso.FolderExists(tempPath) And tempPath <> ""count = count + 1ReDim Preserve arr(1 To count)arr(count) = tempPathtempPath = fso.GetParentFolderName(tempPath)Loop' 3. 倒序循环,创建所有缺失的目录If count > 0 ThenFor i = UBound(arr) To LBound(arr) Step -1If Not fso.FolderExists(arr(i)) Thenfso.CreateFolder arr(i)Debug.Print "已创建:" & arr(i)End IfNext iElse' 如果count为0,说明目标文件夹已存在Debug.Print "文件夹已存在。"End IfSet fso = NothingEnd Sub
如果想验证以上函数功能,仍旧需要写测试代码,参考如下
Sub Test()Dim targetPath As StringtargetPath = "D:\项目\2025年\12月\报告\终稿\"ReversedCreateFolder targetPathMsgBox "操作完成!", vbInformationEnd Sub

结束语
至此,上面两种创建多层文件夹的方法就都介绍完了。最后,我们来简单总结一下它们各自适合用在什么情况,方便你根据实际需要来选择
-
方式一,适合对路径格式有严格要求或需要创建过程中进行更多控制的情况
-
方式二,适合快速、无条件地创建任意深度的目录结构,是批量处理中的常用方法
今天的分享就到这里了,咱们下期继续
公众号同时也在不间断地分享免费的编程案例,如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想提升自我,都可以关注我的公众号“努力鸭是黑色的”,解锁更多的VBA技能

8158

被折叠的 条评论
为什么被折叠?



