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

VBA实现目录递归查找

yuyutoo 2025-01-02 20:10 1 浏览 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. 返回值:如果找到了匹配的文件,函数返回包含这些文件路径的数组。如果没有找到任何文件,函数返回一个真正的空数组。

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

相关推荐

如何在EXCEL中进行IP地址排序

Excel中排序IP地址是非常不友好的,它完全是通过首位进行排序,无法实现我们的实际效果。作为IT人员对于IP地址的真正诉求是想要从小到大排列。那么如何进行排序呢?在Excel中,我们可以使用如下函数...

Excel揭秘!Left函数开启高效字符串左端截取模式

今日推荐:LEFT函数。目的:把一组身份证号码或者一组电话号码的敏感信息隐藏起来。...

五十一、UiPath字符串函数的介绍和使用(转)

一、字符串属性Length:是指字符串长度如:intlen=字符串变量.Length;Chars:是指字符串转换成字符数组,数组从0开始,通常配合Length属性使用如:System.Charc=...

打工人一定要会的Excel的15个技巧!

今天给各位打工人分享15个Excel常用的小技巧,废话不多说,直接开始!先给大家看一张快捷键速查表:1.Ctrl+C和Ctrl+V只是入门你可能已经很熟悉基本的复制粘贴,但如果你想让粘贴操作更高...

go语言中字符串常用的系统函数

最近由于工作比较忙,视频有段时间没有更新了,在这里跟大家说声抱歉了,我尽快抽些时间整理下视频今天就发一篇关于go语言的基础知识吧!我这我工作中用到的一些常用函数,汇总出来分享给大家,希望对...

最全的 ES 重点内容整理(上)

●我们从很多年前就知道ES6,也就是官方发布的ES2015●从2015年开始,官方觉得大家命名太乱了,所以决定以年份命名●但是大家还是习惯了叫做ES6,不过这不重要●重要的是...

2024 最火的5个顶级白板应用,燃爆了!

大家好,很高兴又见面了,我是"...

Excel Trim函数用法的6个实例,Excel 顽固空格的去除方法

在Excel中,Trim函数用于去文本的前后空格和字符之间的空格,但在去字符之间的空格时,它不会把所有空格都去除,而是留下一个空格;如果要把字符之间的所有空格都去掉,需要用Substitute函数...

TS类型体操,看懂你就能玩转TS了

本文以Typescript4.5及以上版本为基础,于2022年02月07日在掘金首发本文要实现一种类型工具...

一种接地气的编码规则:废弃驼峰式命名,告别手敲基础代码。

一种好的编码规则,能提高工作效率。在软件编程领域内,“驼峰”式命名规则是首选方式,最早来源于Perl语言编程的畅销书《programPerl》(oRelly出版)的封面图片正是一匹骆驼,故而得名。...

AI 应用开发最常用的解释型Python语言如何保护源代码

众所周知,解释型语言Python/JavaScript/Perl/Shell是在无需编译,可以直接运行,因此很难保护源代码,例如C、C++、JAVA属于编译型语言,运行之前需要先编译才能运行...

2020年树莓派的5种最佳编程语言

树莓派是最灵活的电脑之一。也许不是在硬件上,但是它的可操作性使它成为一个独立的类。树莓派跨越了电脑和编程之间的鸿沟,让每个人都能接触到电脑。因此,各个年龄段的编程爱好者都掀起了一股编程热潮。它允许他们...

5 种即将消亡的编程语言

每个编写代码的人都有自己喜欢的语言...

[240610] 5 种 Non-Posix Shell 在 x-cmd 上的支持 | Perl 发布 5.40.0

5种非PosixSHell-nushell,fish,xonsh,csh,pwsh利用三天假期,我开始动手增加了对各种Non-Posixshell的x-cmd支持。在这个过程中,...

Linux批量修改文件名及强大的$\「\」用法介绍

一:Rename命令rename命令用字符串替换的方式批量改变文件名。rename命令有两个版本,一个是c语言版本的,一个是perl语言版本的,判断方法:vim`whichrename`C语言版本...

取消回复欢迎 发表评论: