You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA使用FSO遍历文件夹时如何用*通配符匹配多类型文件

VBA FSO文件遍历通配符匹配失效修复

问题现象

需要在指定文件夹的子目录中搜索文件名匹配指定单元格值的目标文档,目标文件格式包含.xlsx、.pdf,原代码尝试在文件名后拼接*通配符实现多格式兼容匹配,但运行时*被识别为普通文本字符,等值匹配失效;将通配符替换为明确的.pdf后缀时可正常匹配到对应文件,需要实现兼容指定格式的搜索效果。

原问题代码如下:

Sub Test2()
    Dim FSO As New FileSystemObject
    Dim myFolder As Scripting.Folder
    Dim mySubFolder As Scripting.Folder
    Dim myFile As File

    Set myFolder = FSO.GetFolder("Folder Path")
    Set Team3 = ThisWorkbook.Worksheets("Team 3 & 3a")
    Rng = Team3.Range("B4:B9")
    
    For Each batch In Rng    
        Filename = batch & "*"

        For Each mySubFolder In myFolder.SubFolders        
            For Each myFile In mySubFolder.Files            
                If myFile.Name = Filename Then                
                    MsgBox myFile.Path
                    Exit For                    
                End If                
            Next            
        Next               
    Next
End Sub

失效原因

FileSystemObject的文件对象Name属性直接使用=做判断时是完全等值匹配,不会将*识别为通配符,只会把它当作文件名中的普通字符做比对,因此拼接*的写法无法达到模糊匹配的效果。

修复方案

使用VBA内置的Like运算符替代=做判断,Like原生支持*(匹配任意长度任意字符)、?(匹配单个任意字符)等通配符规则,同时补全原代码缺失的变量声明、增加空值跳过、大小写兼容处理,修复后代码如下:

Sub Test2()
    Dim FSO As New FileSystemObject
    Dim myFolder As Scripting.Folder
    Dim mySubFolder As Scripting.Folder
    Dim myFile As Scripting.File
    Dim Team3 As Worksheet
    Dim Rng As Range
    Dim batch As Variant
    
    ' 请将此处替换为实际的目标文件夹绝对路径
    Set myFolder = FSO.GetFolder("Folder Path")
    Set Team3 = ThisWorkbook.Worksheets("Team 3 & 3a")
    Set Rng = Team3.Range("B4:B9")
    
    For Each batch In Rng
        ' 跳过空单元格,避免无效匹配
        If VBA.Trim(batch.Value) <> "" Then
            For Each mySubFolder In myFolder.SubFolders
                For Each myFile In mySubFolder.Files
                    ' 统一转小写匹配,规避文件名大小写差异导致的匹配失败
                    ' 若需匹配所有后缀格式,使用判断:LCase(myFile.Name) Like LCase(batch.Value) & "*"
                    ' 以下判断仅匹配Excel格式(.xls/.xlsx/.xlsm等)和PDF格式
                    If LCase(myFile.Name) Like LCase(batch.Value) & ".xls*" _
                        Or LCase(myFile.Name) Like LCase(batch.Value) & ".pdf" Then
                        MsgBox myFile.Path
                        ' 找到对应文件后可根据需求选择是否跳出循环终止当前批次搜索
                        Exit For
                    End If
                Next
            Next
        End If
    Next
End Sub

补充说明

  • 原代码未显式声明Team3、Rng、batch等变量,属于隐式Variant声明,容易触发类型不匹配错误,修复代码已补全所有变量的显式声明。
  • 原遍历逻辑仅会搜索目标文件夹下的一级子文件夹,如果需要覆盖多层嵌套的子目录,需要额外增加递归遍历逻辑。
  • 若仅需要匹配.xlsx和.pdf两类格式,不建议使用*匹配所有后缀,避免匹配到同名临时文件、其他无关格式文档,精准指定后缀匹配规则即可。

内容的提问来源于stack exchange,提问作者Ryan Hare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 00:27:27