有没有一种方法可以使用VBA在未知文件夹中打开具有已知名称的文件?

时间:2020-08-06 04:20:58

标签: excel vba

我每天都会运行一系列报告,它们会根据日期保存在文件夹中。 例如:C:\ Users \ Desktop \ Test \ Current \ 2020 08 05 \ Report_Name 2020 08 05.xlsx

第二天,我运行新报告,并将“ 2020 08 05”文件夹移至存档。但是新报告会从前一天的报告中提取数据,因此我需要在不指定日期文件夹名称的情况下打开它。

我尝试使用通配符,但这不起作用。

    Sub OpenReport()
    Dim sFound As String
    Dim Path As String
    
    Path = "C:\Users\Desktop\Test\Current\*\"
    
    sFound = Dir(Path & "\Report_Name*.xlsx")
        If sFound <> "" Then
            Workbooks.Open Filename:=Path & "\" & sFound
        End If

结束子

2 个答案:

答案 0 :(得分:0)

您可以在每个文件夹和子文件夹中搜索指定的文件名。

我个人喜欢非递归方法,并且之前多次对此问题找到“ cor_blimeys”答案很有帮助。

Loop Through All Subfolders Using VBA

基本上,您创建一个新的集合,遍历根目录中的文件/文件夹,在找到该集合时将文件夹添加到该集合中,然后遍历每个子文件夹以查找文件名。

递归方法总是会严重伤害我的大脑,并发现非递归方法更易于调试和逐步执行。只是个人意见。

无论哪种方式,请阅读链接。

答案 1 :(得分:0)

由于文件路径的名称是固定的(日期除外),因此只需生成它即可:

Function yesterdayReport() As String
    Const sBasePath As String = "C:\Users\Desktop\Test\Current\"
    Dim sDT As String

sDT = Format(Date - 1, "yyyy mm dd")
yesterdayReport = sBasePath & sDT & "\Report_Name " & sDT & ".xlsx"
    
End Function

如果需要查找上一个工作日(考虑到周末和节假日),则可以使用WorkDay函数之一。

例如:

Option Explicit
Function yesterdayReport() As String
    Const sBasePath As String = "C:\Users\Desktop\Test\Current\"
    Dim sDT As String, dt As Date
    Dim vHolidays
    
vHolidays = Array(#1/1/2020#, #7/4/2020#, #8/5/2020#)
dt = Application.WorksheetFunction.WorkDay(Date, -1, vHolidays)

sDT = Format(dt, "yyyy mm dd")
yesterdayReport = sBasePath & sDT & "\Report_Name " & sDT & ".xlsx"
    
End Function

您显示的holiday参数可以是硬编码(如我所示),也可以从工作表上的某个范围中获取。

如果您的周末不是周六/周日,则会有一些变化。