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

如何在VBA中获取路径含可变文件夹的指定文件?

问题

作为半资深构建与部署专员,我需要编写VBA脚本提取部署后生成的版本号文件内容,填入指定单元格。
部署后生成的FileIWant.txt内容格式固定:

<Version Number>V5.65.3</Version Number>

但文件路径存在两个随机名称的文件夹,其余路径固定,示例路径:

\\servername\constantFolder\applicationName\temp\constantFolder\temp\RANDOMSTRING\RANDOMSTRING2\constantFolder\constantFolder\FileIWant.txt

尝试用Dir("\\server\constantFolder\applicationName\temp\*\constantFolder\constantFolder\FileIWant.txt")无法实现,还出现运行时错误“52”:错误的文件名或编号,需要解决如何在VBA中定位这类含可变文件夹的文件。

解决方案

核心原因

VBA的Dir函数仅支持单个路径段的通配符匹配,不能跨多层文件夹使用*,直接写多层通配符会触发路径格式错误。


方法1:逐层遍历可变文件夹

针对已知的两层随机文件夹,逐层遍历父目录下的子文件夹,拼接路径后查找目标文件:

Sub FindVersionFile()
    Dim basePath As String
    Dim firstRandFolder As String
    Dim secondRandFolder As String
    Dim targetPath As String
    Dim versionText As String
    Dim versionNum As String
    
    ' 固定到第一个随机文件夹的上级目录
    basePath = "\\servername\constantFolder\applicationName\temp\constantFolder\temp\"
    
    ' 遍历第一层随机文件夹
    firstRandFolder = Dir(basePath, vbDirectory)
    Do While firstRandFolder <> ""
        If firstRandFolder <> "." And firstRandFolder <> ".." Then
            ' 遍历第二层随机文件夹
            secondRandFolder = Dir(basePath & firstRandFolder & "\", vbDirectory)
            Do While secondRandFolder <> ""
                If secondRandFolder <> "." And secondRandFolder <> ".." Then
                    ' 拼接完整目标路径
                    targetPath = basePath & firstRandFolder & "\" & secondRandFolder & "\constantFolder\constantFolder\FileIWant.txt"
                    
                    ' 检查文件是否存在
                    If Dir(targetPath) <> "" Then
                        ' 读取文件内容
                        Open targetPath For Input As #1
                        Line Input #1, versionText
                        Close #1
                        
                        ' 提取版本号(基于固定标签格式截取)
                        versionNum = Mid(versionText, InStr(versionText, ">") + 1, InStr(versionText, "<") - InStr(versionText, ">") - 1)
                        
                        ' 填入指定单元格(示例为Sheet1的A1)
                        ThisWorkbook.Sheets("Sheet1").Range("A1").Value = versionNum
                        
                        ' 找到文件后直接退出
                        Exit Sub
                    End If
                End If
                secondRandFolder = Dir
            Loop
        End If
        firstRandFolder = Dir
    Loop
    
    MsgBox "未找到目标版本文件", vbExclamation
End Sub

方法2:递归查找(适配可变层级场景)

如果后续可能出现更多随机文件夹层级,用递归函数遍历所有子目录查找目标文件:

Sub RecursiveFindVersion()
    Dim startPath As String
    Dim targetFileName As String
    Dim foundFilePath As String
    
    startPath = "\\servername\constantFolder\applicationName\temp\constantFolder\temp\"
    targetFileName = "FileIWant.txt"
    
    ' 调用递归函数查找
    foundFilePath = FindFileRecursive(startPath, targetFileName)
    
    If foundFilePath <> "" Then
        ' 读取并提取版本号
        Dim versionText As String
        Open foundFilePath For Input As #1
        Line Input #1, versionText
        Close #1
        
        Dim versionNum As String
        versionNum = Mid(versionText, InStr(versionText, ">") + 1, InStr(versionText, "<") - InStr(versionText, ">") - 1)
        
        ThisWorkbook.Sheets("Sheet1").Range("A1").Value = versionNum
    Else
        MsgBox "未找到目标文件", vbExclamation
    End If
End Sub

Function FindFileRecursive(searchPath As String, fileName As String) As String
    Dim dirName As String
    Dim filePath As String
    
    ' 检查当前目录是否存在目标文件
    filePath = Dir(searchPath & fileName)
    If filePath <> "" Then
        FindFileRecursive = searchPath & filePath
        Exit Function
    End If
    
    ' 遍历当前目录下的子文件夹,递归查找
    dirName = Dir(searchPath, vbDirectory)
    Do While dirName <> ""
        If dirName <> "." And dirName <> ".." Then
            FindFileRecursive = FindFileRecursive(searchPath & dirName & "\", fileName)
            ' 找到文件后立即返回,终止递归
            If FindFileRecursive <> "" Then Exit Function
        End If
        dirName = Dir
    Loop
    
    ' 未找到返回空字符串
    FindFileRecursive = ""
End Function

注意事项

  • 遍历文件夹时必须排除.和..这两个系统默认目录,避免无效循环
  • 版本号提取逻辑基于固定的XML标签格式,若后续标签格式变更,需同步调整InStr的定位规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:23:24