利用EXCEL扫描同文件夹内所有文件夹

想利用excel汇总一下同文件夹内的所有文件夹,供搜索和整理,让deepseek写了以下代码。汇总成表,并提供超链接,这样管理起来更加清晰一些。

Sub ScanAllFoldersRecursive()
    Dim objFSO As Object
    Dim ws As Worksheet
    Dim i As Long
    Dim basePath As String
    Dim folderCount As Long
    Dim skippedCount As Long
    
    ' 设置工作表
    Set ws = ThisWorkbook.Sheets(1)
    ws.Cells.Clear
    ws.Range("A1:E1").Value = Array("序号", "文件夹名称", "完整路径", "层级", "超链接")
    ws.Range("A1:E1").Font.Bold = True
    
    ' 获取当前工作簿所在路径
    basePath = ThisWorkbook.Path
    If basePath = "" Then
        MsgBox "请先保存工作簿!", vbExclamation
        Exit Sub
    End If
    
    ' 创建文件系统对象
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    i = 2 ' 从第二行开始
    folderCount = 0
    skippedCount = 0
    
    ' 开始递归扫描
    Call ScanFolder(objFSO.GetFolder(basePath), ws, i, folderCount, skippedCount, 0, basePath)
    
    ' 自动调整列宽
    ws.Columns("A:E").AutoFit
    
    ' 添加边框
    If i > 2 Then
        With ws.Range("A1:E" & i - 1).Borders
            .LineStyle = xlContinuous
            .Weight = xlThin
        End With
    End If
    
    ' 添加筛选功能
    ws.Range("A1:E1").AutoFilter
    
    ' 美化表格
    With ws
        .Rows(1).RowHeight = 25
        .Range("A1:E1").Interior.Color = RGB(200, 200, 200)
        .Range("A1:E1").HorizontalAlignment = xlCenter
    End With
    
    ' 显示结果消息
    Dim msg As String
    msg = "扫描完成!" & vbCrLf & _
          "找到文件夹总数: " & folderCount & " 个" & vbCrLf & _
          "跳过文件夹: " & skippedCount & " 个"
    
    MsgBox msg, vbInformation, "扫描结果"
    
    ' 清理对象
    Set objFSO = Nothing
End Sub

' 递归扫描文件夹的核心函数
Sub ScanFolder(parentFolder As Object, ws As Worksheet, ByRef rowIndex As Long, _
               ByRef folderCount As Long, ByRef skippedCount As Long, _
               level As Integer, basePath As String)
    Dim subFolder As Object
    Dim subSubFolder As Object
    
    On Error Resume Next
    
    ' 首先处理当前父文件夹的直接子文件夹
    For Each subFolder In parentFolder.SubFolders
        ' 跳过系统文件夹和临时文件夹
        If Not IsSystemOrTempFolder(subFolder.Name) Then
            ' 检查文件夹是否可访问
            Dim testAttr As Integer
            testAttr = subFolder.Attributes
            If Err.Number = 0 Then
                ' 添加到工作表
                ws.Cells(rowIndex, 1).Value = rowIndex - 1 ' 序号
                ws.Cells(rowIndex, 2).Value = subFolder.Name
                ws.Cells(rowIndex, 3).Value = subFolder.Path
                ws.Cells(rowIndex, 4).Value = level ' 层级
                
                ' 创建超链接
                ws.Hyperlinks.Add Anchor:=ws.Cells(rowIndex, 5), _
                                 Address:=subFolder.Path, _
                                 TextToDisplay:="打开文件夹"
                
                rowIndex = rowIndex + 1
                folderCount = folderCount + 1
                
                ' 递归扫描子文件夹的子文件夹(增加层级)
                If level < 20 Then ' 防止无限递归,设置最大层级为20
                    Call ScanFolder(subFolder, ws, rowIndex, folderCount, skippedCount, level + 1, basePath)
                End If
            Else
                ' 清除错误并跳过
                Err.Clear
                skippedCount = skippedCount + 1
            End If
        Else
            skippedCount = skippedCount + 1
        End If
    Next subFolder
    
    On Error GoTo 0
End Sub

' 辅助函数:检查是否为系统或临时文件夹
Function IsSystemOrTempFolder(folderName As String) As Boolean
    ' 跳过以特定前缀开头的文件夹
    Dim excludePrefixes As Variant
    excludePrefixes = Array("~$", ".", "$", "System Volume Information", "RECYCLE", "Windows", "Config.Msi", "MSOCache")
    
    Dim prefix As Variant
    For Each prefix In excludePrefixes
        If Left(folderName, Len(prefix)) = prefix Then
            IsSystemOrTempFolder = True
            Exit Function
        End If
    Next prefix
    
    ' 跳过隐藏文件夹(名称包含特定字符)
    If InStr(folderName, "~") > 0 Or InStr(folderName, "$") > 0 Then
        IsSystemOrTempFolder = True
        Exit Function
    End If
    
    IsSystemOrTempFolder = False
End Function

' 创建扫描按钮
Sub AddScanButton()
    Dim btn As Button
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Sheets(1)
    
    ' 删除现有按钮
    On Error Resume Next
    ws.Buttons.Delete
    On Error GoTo 0
    
    ' 添加新按钮
    Set btn = ws.Buttons.Add(10, 10, 150, 30)
    With btn
        .Caption = "扫描所有子文件夹"
        .OnAction = "ScanAllFoldersRecursive"
        .Name = "ScanAllButton"
    End With
    
    MsgBox "扫描按钮已添加!点击即可扫描所有层级的子文件夹。"
End Sub

' 初始化并开始扫描
Sub InitializeAndScan()
    AddScanButton
    ScanAllFoldersRecursive
End Sub

' 快速扫描(不包含按钮添加)
Sub QuickScan()
    ScanAllFoldersRecursive
End Sub

标签: excel

移动端可扫我直达哦~

推荐阅读

thumbnail 2025-03-13

Excel自动生成含超链接目录的方法

工作久了,积累了很多的碎片资料,为了方便查找,就将他们塞进了一个excel文件分表保存。然而追求方便快捷之路哪有什么尽头,于是又想要一份可以跳转并返回的目录,自动将其他表格的表格名称汇总到目录表,并在分表添加返回目录的按钮。这几天尝试...

工作相关 excel

thumbnail 2025-01-11

在EXCEL中根据出生年龄计算延迟退休的尝试

之前尝试用EXCEL拉了一张延迟退休表生成了文字版本而非图片版本的延迟退休表格。但也遗留了一个问题,就是如果根据单个表格内的出生日期,来计算延迟退休的日期。其实当时也做过类似的尝试了,这里尝试补完一下。日期函数在EXCEL中,类似20...

工作相关 excel

thumbnail 2024-12-30

在excel中自动计算法定退休年龄

在制作“法定退休年龄对照表”的时候遇到了一个小问题,月份是可以自动填充的,每4个月自动增加1个月的逻辑也可以被自动填充。但“改革后法定退休年龄”这一栏的逻辑就稍微复杂了一点,依赖自动填充就不可取了。改革后法定退休年龄“改革后法定退休年...

工作相关 excel

thumbnail 2024-09-09

如何利用VBA移除EXCEL文件的密码保护

收到了客户两张电子表格,需要修改几项数据,其中一张表格是直接可以修改的,但同一压缩包里的另一个文件则显示受保护,读取没问题,修改就不行了,询问客户密码也是一问三不知。无奈在51CTO找了这么一个暴力测试的方案,程序会在成功后弹窗提示该...

工作相关 excel

thumbnail 2024-01-09

EXCEL如何跳过空白单元格粘贴内容

除了函数与功能太多,随用随忘之外,个人觉得excel堪称完美,即便随用随忘,那始终还是博主自身存储空间和存储质量的原因。就好像类似下面的需求,把一段包含空格的内容隔行穿插到左边的单元格内。明明是曾经操作过的,但如何解决的却一下又想不起...

工作相关 excel

thumbnail 2023-09-14

Excel仅复制已筛选出来的单元格

利用Excel可以很方便的对数据进行筛选,但是如果框选筛选完成的数据,然后直接复制粘贴的话,我们会得到一个完整的包含所有数据的表格。快捷键筛选其实只是把不符合条件的单元格暂时的隐藏了起来,如果仔细观察一下屏幕左侧的行号,可以发现此时行...

工作相关 excel

thumbnail 2023-05-10

利用excel实现函数数据的保存与删除

刚工作的时候,因为经常要把订单整理出具体要求,然后下发到车间,所以diy了一个订单系统,利用了一些excel自动生成数据的函数。比如用“today()”来实现下单的日期,用“sum()”来统计总体的数量。这个简陋的管理系统用于打印是没...

工作相关 excel

thumbnail 2023-05-10

Excel快递单根据地区填写预计签收日期

excel中有很多关于日期的函数,博主比较常用的是“today()”,因为工作中经常需要印发订单到车间,订单上的下发日期上写上一个这个函数,因为该函数会随日期自动变化,所以就一劳永逸了。偶尔也碰到过客户单项的数量与合计数量不符的情况,...

工作相关 excel

thumbnail 2023-01-10

excel求和过程中如何忽略错误的值

设计逻辑不够严谨的表格中,往往会遇到“被零除”错误,表格中会显示“#DIV/0!”字样,如果对包含该错误的单元格进行求和操作,在求和格子中,用户往往也会收到一个相同的错误。修改表格逻辑当然是治标又治本的方法,但是当我们急于想知道其他非...

工作相关 excel

thumbnail 2022-10-14

用excel根据列表自动填写快递面单

整理网盘的时候翻到一个很久以前做的表格,根据表格地址自动定位数据打印快递面单。涉及到了工作薄内不同表格间的数据调用,以及vba弹出窗口的返回信息,贴在博客上以便将来有需要的时候查找。表格的vba代码Sub test() Dim...

工作相关 excel

thumbnail 2022-10-13

excel文件内工作表太多如何快速定位

excel一个文件可以视为一个工作薄,一个工作薄可以包含多张表格,将多张表格统一放在一个文件中,可以方便的进行数据的分析与交换,也更易于管理。但当表格数目较多时,仅依靠左下角的前进与后退按钮感觉是有点不够用的,这里介绍两种快速切换工作...

工作相关 excel