如何在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
相关产品推荐
相关产品推荐

