我每天都会运行一系列报告,它们会根据日期保存在文件夹中。 例如: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
结束子
答案 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
参数可以是硬编码(如我所示),也可以从工作表上的某个范围中获取。
如果您的周末不是周六/周日,则会有一些变化。