【Excel VBA 编程】第82讲:掌握FSO的CreateFolder方法,轻松实现多层文件夹智能创建

经过前几期的学习,我们对FSO有了初步的认识,掌握了管理文件夹和文件的基本方法

接下来就来运用这些知识,解决一个实际工作中常会遇到的问题——如何一次性地创建出多层嵌套的文件夹结构,也就是“级联创建文件夹

何为级联创建

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

即使上述路径中间的一些上级文件夹(如“12月”、“报告”)不存在,程序也能自动把它们一并创建出来,而不是因为路径不存在就报错

其本质还是创建文件夹,那么,我们就需要回顾一下,使用FSO的哪一方法才能创建文件夹呢?当然是CreateFolder,忘记的小伙伴可以点击链接查看原文:【Excel VBA 编程】第80讲:文件夹操作的“十八般武艺

前文也提到过CreateFolder方法只能创建单级文件夹,且父级文件夹必须存在。这句话的意思是说,如果我们要创建一个名为“初稿”的文件夹,那么必须保证其上的“报告”、“12月”、“2025年”及“项目”文件夹都必须存在

最行之有效的方法是在代码中连续调用5次CreateFolder方法,如下

    Dim fso As Object    Set 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 Boolean    On Error GoTo ErrorHandler    Dim fso As Object    Set 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 = "" Then        MsgBox "路径为空!", vbCritical        CreateMultiLevelFolder = False        Exit Function    End If    ' 3. 分割路径并逐级创建    Dim pathParts() As String    Dim currentPath As String    Dim i As Integer    pathParts = Split(folderPath, "\")    currentPath = pathParts(0) & "\" ' 初始化,如 “D:\”    For i = 1 To UBound(pathParts)        currentPath = currentPath & pathParts(i) & "\"        ' 如果当前级文件夹不存在,则创建        If Not fso.FolderExists(currentPath) Then            fso.CreateFolder currentPath        End If    Next i    ' 4. 最终确认创建成功    If fso.FolderExists(folderPath) Then        CreateMultiLevelFolder = True    Else        CreateMultiLevelFolder = False    End If    Set fso = Nothing    Exit FunctionErrorHandler:    MsgBox "创建文件夹时出错:" & Err.Description, vbCritical    CreateMultiLevelFolder = False    Set fso = NothingEnd Function

CreateMultiLevelFolder函数说明:

  • 函数实现功能:自顶向下逐级创建多级目录

  • 参数:folderPath指需要创建的完整文件夹路径

  • 返回值:成功创建返回True,失败返回False

为了验证CreateMultiLevelFolder的功能,我们可以写一段简单的测试代码:

Sub Test()    Dim targetPath As String    targetPath = " D:\项目\2026年\第一季度\1月\报告\初稿\"       If CreateMultiLevelFolder(targetPath) Then        MsgBox "目录创建成功!", vbInformation    End 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 Object    Dim arr() As String    Dim tempPath As String    Dim i As Integer    Dim count As Integer    Set fso = CreateObject("Scripting.FileSystemObject")    ' 1. 标准化路径    folderPath = Replace(folderPath, "/", "\")    ' 2. 查找首个存在的父目录,并记录缺失路径    tempPath = folderPath    count = 0    Do While Not fso.FolderExists(tempPath) And tempPath <> ""        count = count + 1        ReDim Preserve arr(1 To count)        arr(count) = tempPath        tempPath = fso.GetParentFolderName(tempPath)    Loop    ' 3. 倒序循环,创建所有缺失的目录    If count > 0 Then        For i = UBound(arr) To LBound(arr) Step -1            If Not fso.FolderExists(arr(i)) Then                fso.CreateFolder arr(i)                Debug.Print "已创建:" & arr(i)            End If        Next i    Else        ' 如果count为0,说明目标文件夹已存在        Debug.Print "文件夹已存在。"    End If    Set fso = NothingEnd Sub

如果想验证以上函数功能,仍旧需要写测试代码,参考如下

Sub Test()    Dim targetPath As String    targetPath = "D:\项目\2025年\12月\报告\终稿\"    ReversedCreateFolder targetPath    MsgBox "操作完成!", vbInformationEnd Sub

结束语

至此,上面两种创建多层文件夹的方法就都介绍完了。最后,我们来简单总结一下它们各自适合用在什么情况,方便你根据实际需要来选择

  • 方式一,适合对路径格式有严格要求或需要创建过程中进行更多控制的情况

  • 方式二,适合快速、无条件地创建任意深度的目录结构,是批量处理中的常用方法

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wei1019

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值