百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

VBA实现目录递归查找

yuyutoo 2025-01-02 20:10 2 浏览 0 评论

有时候我们需要读取某个目录下所有文件,并且按照文件名进行筛选文件。本篇利用VBA实现了该功能。

代码

Function ListCustomFilesInFolderRecursively(FolderPath As String, Optional CustomRuleName As Variant) As Variant  
    '''  
    ' 列出指定文件夹及其所有子文件夹中满足特定规则(如果提供)的文件路径。  
    '  
    ' 参数:  
    ' FolderPath (String) - 要搜索的文件夹的路径。  
    ' CustomRuleName (Variant, Optional) - 可选的正则表达式规则,用于过滤文件名。  
    '  
    ' 返回值:  
    ' Variant - 包含匹配文件路径的数组(如果找到文件);如果没有找到文件,则返回一个空数组。  
    '''  
    Dim FSO As Object  
    Dim Folder As Object  
    Dim SubFolder As Object  
    Dim File As Object  
    Dim FileName As String  
    Dim FilePaths() As Variant ' 用于存储文件路径的数组  
    Dim FileCount As Long ' 跟踪数组中的文件数量  
    Dim Pattern As String ' 正则表达式模式  
    Dim Regex As Object ' 正则表达式对象  
    Dim Err As Object  
      
    ' 初始化文件计数为0和文件路径数组  
    FileCount = 0  
    ReDim FilePaths(0 To 0) ' 初始化为一个元素的数组,用于可能的ReDim Preserve  
      
    ' 创建FileSystemObject对象  
    Set FSO = CreateObject("Scripting.FileSystemObject")  
      
    ' 检查文件夹是否存在  
    If Not FSO.FolderExists(FolderPath) Then  
        ListCustomFilesInFolderRecursively = Array() ' 如果没有找到文件夹,则返回一个空数组  
        Exit Function  
    End If  
      
    ' 如果提供了CustomRuleName,则创建正则表达式对象并设置模式  
    If Not IsMissing(CustomRuleName) Then  
        Set Regex = CreateObject("VBScript.RegExp")  
        With Regex  
            .Global = True ' 设置全局匹配  
            .Pattern = CustomRuleName ' 设置正则表达式模式  
        End With  
    End If  
      
    ' 设置文件夹对象并遍历文件夹中的文件  
    Set Folder = FSO.GetFolder(FolderPath)  
    On Error Resume Next ' 开始错误处理  
    For Each File In Folder.Files  
        FileName = FSO.GetFileName(File.Name) ' 获取文件名,不包括路径  
          
        ' 如果提供了CustomRuleName,则使用正则表达式检查文件名  
        If Not IsMissing(CustomRuleName) And Regex.Test(FileName) Then  
            ' 将文件路径添加到数组中  
            ReDim Preserve FilePaths(0 To FileCount) ' 调整数组大小  
            FilePaths(FileCount) = File.Path  
            FileCount = FileCount + 1  
        ElseIf IsMissing(CustomRuleName) Then  
            ' 如果没有提供CustomRuleName,则默认匹配所有文件  
            ' 将文件路径添加到数组中  
            ReDim Preserve FilePaths(0 To FileCount) ' 调整数组大小  
            FilePaths(FileCount) = File.Path  
            FileCount = FileCount + 1  
        End If  
    Next File  
      
    ' 遍历子文件夹  
    For Each SubFolder In Folder.SubFolders  
        ' 递归调用此函数来处理子文件夹,并将结果添加到数组中  
        Dim SubFolderFiles As Variant  
        SubFolderFiles = ListCustomFilesInFolderRecursively(SubFolder.Path, CustomRuleName)  
          
        ' 将子文件夹中的文件路径追加到主数组中  
        If IsArray(SubFolderFiles) Then ' 确保SubFolderFiles是一个数组  
            Dim i As Long  
            For i = LBound(SubFolderFiles) To UBound(SubFolderFiles)  
                ReDim Preserve FilePaths(0 To FileCount) ' 调整数组大小  
                FilePaths(FileCount) = SubFolderFiles(i)  
                FileCount = FileCount + 1  
            Next i  
        End If  
    Next SubFolder  
      
    On Error GoTo 0 ' 结束错误处理  
      
    ' 清理对象  
    If Not IsMissing(CustomRuleName) Then  
        Set Regex = Nothing  
    End If  
    Set File = Nothing  
    Set SubFolder = Nothing  
    Set Folder = Nothing  
    Set FSO = Nothing  
      
    ' 返回包含文件路径的数组(或空数组如果没有找到文件)  
    If FileCount > 0 Then  
        ListCustomFilesInFolderRecursively = FilePaths  
    Else  
        ' 如果没有找到任何文件,返回空数组  
        ListCustomFilesInFolderRecursively = Array()  
    End If  
End Function

测试

一个简单的测试,找出给定目录下所有的excel文件。

Sub test()
    res = ListCustomFilesInFolderRecursively("F:\practice\vba-jsa\vba_20231121", ".xlsx|.xls")
End Sub

代码说明

上述代码定义了一个名为 ListCustomFilesInFolderRecursively 的 VBA 函数,其主要功能是递归地列出指定文件夹及其所有子文件夹中满足特定规则(如果提供)的文件路径。以下是对代码的简要解释:

  1. 函数定义与参数:FolderPath:一个字符串,代表要搜索的文件夹的路径。CustomRuleName:一个可选的变体类型参数,用于提供正则表达式的规则来过滤文件名。
  2. 局部变量声明:FSO:用于文件系统操作的 Scripting.FileSystemObject 对象。Folder、SubFolder、File:分别代表当前处理的文件夹、子文件夹和文件对象。FileName:用于存储当前文件的名称。FilePaths:一个数组,用于存储所有匹配的文件路径。FileCount:一个长整型变量,用于跟踪数组中已存储的文件数量。Pattern:用于存储正则表达式的模式(但在这个代码版本中并未使用)。Regex:一个正则表达式对象,用于测试文件名是否匹配提供的规则。Err:一个错误对象,但在这个代码版本中并未使用。
  3. 初始化:初始化文件计数为0,并初始化文件路径数组为一个元素的数组,以便后续使用 ReDim Preserve 来调整数组大小。
  4. 检查文件夹是否存在:使用 FSO 检查提供的 FolderPath 是否存在。如果不存在,函数返回一个空数组。
  5. 创建正则表达式对象(如果提供了规则):如果提供了 CustomRuleName,则创建一个正则表达式对象并设置其全局匹配属性和模式。
  6. 遍历当前文件夹的文件:对于当前文件夹中的每个文件,检查其名称是否匹配正则表达式(如果提供了规则),或者如果没有提供规则,则默认匹配所有文件。匹配的文件路径被添加到 FilePaths 数组中。
  7. 递归遍历子文件夹:对于当前文件夹的每个子文件夹,递归调用 ListCustomFilesInFolderRecursively 函数,并将结果(子文件夹中的文件路径)追加到主 FilePaths 数组中。
  8. 错误处理:使用 On Error Resume Next 来忽略处理文件或子文件夹时可能发生的错误(例如,权限问题)。
  9. 清理:在函数结束前,释放所有创建的对象,以避免内存泄漏。
  10. 返回值:如果找到了匹配的文件,函数返回包含这些文件路径的数组。如果没有找到任何文件,函数返回一个真正的空数组。

这个函数通过递归地遍历文件夹和子文件夹,以及使用正则表达式(如果提供)来过滤文件名,提供了一个灵活且强大的工具来列出指定文件夹结构中的文件。

相关推荐

如何在HTML中使用JavaScript:从基础到高级的全面指南!

“这里是云端源想IT,帮你...

推荐9个Github上热门的CSS开源框架

大家好,我是Echa。...

前端基础知识之“CSS是什么?”_前端css js

...

硬核!知网首篇被引过万的论文讲了啥?作者什么来头?

整理|袁小华近日,知网首篇被引量破万的中文论文及其作者备受关注。知网中心网站数据显示,截至2021年7月23日,由华南师范大学教授温忠麟等人发表在《心理学报》2004年05期上的学术论文“中介效应检验...

为什么我推荐使用JSX开发Vue3_为什么用vue不用jquery

在很长的一段时间中,Vue官方都以简单上手作为其推广的重点。这确实给Vue带来了非常大的用户量,尤其是最追求需求开发效率,往往不那么在意工程代码质量的国内中小企业中,Vue占据的份额极速增长...

【干货】一文详解html和css,前端开发需要哪些技术?
【干货】一文详解html和css,前端开发需要哪些技术?

网站开发简介...

2025-02-20 18:34 yuyutoo

分享几个css实用技巧_cssli

本篇将介绍几个css小技巧,目录如下:自定义引用标签的符号重置所有标签样式...

如何在浏览器中运行 .NET_怎么用浏览器运行代码

概述:...

前端-干货分享:更牛逼的CSS管理方法-层(CSS Layers)

使用CSS最困难的部分之一是处理CSS的权重值,它可以决定到底哪条规则会最终被应用,尤其是如果你想在Bootstrap这样的框架中覆盖其已有样式,更加显得麻烦。不过随着CSS层的引入,这一...

HTML 基础标签库_html标签基本结构
HTML 基础标签库_html标签基本结构

HTML标题HTML标题(Heading)是通过-...

2025-02-20 18:34 yuyutoo

前端css面试20道常见考题_高级前端css面试题

1.请解释一下CSS3的flexbox(弹性盒布局模型),以及适用场景?display:flex;在父元素设置,子元素受弹性盒影响,默认排成一行,如果超出一行,按比例压缩flex:1;子元素设置...

vue引入外部js文件并使用_vue3 引入外部js

要在Vue中引入外部的JavaScript文件,可以使用以下几种方法:1.使用``标签引入外部的JavaScript文件。在Vue的HTML模板中,可以直接使用``标签来引入外部的JavaScrip...

网页设计得懂css的规范_html+css网页设计

在初级的前端工作人员,刚入职的时候,可能在学习前端技术,写代码不是否那么的规范,而在工作中,命名的规范的尤为重要,它直接与你的代码质量挂钩。网上也受很多,但比较杂乱,在加上每年的命名都会发生一变化。...

Google在Chrome中引入HTML 5.1标记

虽然负责制定Web标准的WorldWideWebConsortium(W3C)尚未宣布HTML5正式推荐规格,而Google已经迁移到了HTML5.1。即将发布的Chrome38将引入H...

HTML DOM 引用( ) 对象_html中如何引用js

引用对象引用对象定义了一个同内联元素的HTML引用。标签定义短的引用。元素经常在引用的内容周围添加引号。HTML文档中的每一个标签,都会创建一个引用对象。...

取消回复欢迎 发表评论: