Excel vba – 用variables(date)文件名打开文件

我有下面的代码来打开具有可变文件名称的文件,由于date在其中。 我亲自保存每个文件与date戳,即今天上午我保存了昨天的date,4.20.17文件。

此代码将在每周五早上运行,目标是加载最近5个工作日的文件(上周五,本周一,周二,周三,周四)从这些文件中获取一些信息(从每个文件复制2个单元格),将这些信息粘贴到新的表格中,最后closures每个文件。

目前,代码是用来告诉我什么时候文件不存在(例如,上周五是“耶稣受难日”,所以星期一早上,我没有为上周五创build任何文件),然后忽略并移动过去那一天。

我现在的问题(除了代码很长,可能会连接)是上个星期四存在的文件,但我的代码告诉我没有。 我被告知这是因为代码实际上是在今天(星期四),而不是在一个星期前的星期四,那里实际上是一个文件。

任何援助表示赞赏。 我删除了几天,使下面的代码更less的熊看,和一个示例文件名是“代理小组每日摘要4.19.17”

Const strFilePath As String = "D:\Users\stefan.bagnato\Desktop\Daily Performance Summary\Agent Group Daily Summary " Dim LastFridayDate, MondayDate, TuesdayDate, WednesdayDate, ThursdayDate As String Dim fullFileNameLastFriday, fullFileNameMonday, fullFileNameTuesday, fullFileNameWednesday, fullFileNameThursday As String Dim wbkLastFriday, wbkMonday, wbkTuesday, wbkWednesday, wbkThursdayOpen As Workbook LastFridayDate = Format(Date - (Weekday(Date, vbFriday) - 1), "mdyy") fullFileNameLastFriday = strFilePath & LastFridayDate & ".xls" If Dir(fullFileNameLastFriday) = "" Then MsgBox "File for last Friday doesn't exist!" GoTo ExitLastFriday End If Set wbkLastFriday = Workbooks.Open(fullFileNameLastFriday, False, True) Call BasicDailySummary wbkLastFriday.Activate Range("T2:T8").Copy fp.Activate Range("B3:B9").PasteSpecial xlPasteValues wbkLastFriday.Activate Range("F2:F8").Copy fp.Activate Range("G3:G9").PasteSpecial xlPasteValues wbkLastFriday.Close SaveChanges:=False ExitLastFriday: MondayDate = Format(Date - (Weekday(Date, vbMonday) - 1), "mdyy") fullFileNameMonday = strFilePath & MondayDate & ".xls" If Dir(fullFileNameMonday) = "" Then MsgBox "File for Monday doesn't exist!" GoTo ExitMonday End If Set wbkMonday = Workbooks.Open(fullFileNameMonday, False, True) Call BasicDailySummary wbkMonday.Activate Range("T2:T8").Copy fp.Activate Range("C3:C9").PasteSpecial xlPasteValues wbkMonday.Activate Range("F2:F8").Copy fp.Activate Range("H3:H9").PasteSpecial xlPasteValues wbkMonday.Close SaveChanges:=False ExitMonday: .................................... ThursdayDate = Format(Date - (Weekday(Date, vbThursday) - 1), "mdyy") fullFileNameThursday = strFilePath & ThursdayDate & ".xls" If Dir(fullFileNameThursday) = "" Then MsgBox "File for Thursday doesn't exist!" GoTo ExitThursday End If Set wbkThursday = Workbooks.Open(fullFileNameThursday, False, True) Call BasicDailySummary wbkThursday.Activate Range("T2:T8").Copy fp.Activate Range("F3:F9").PasteSpecial xlPasteValues wbkThursday.Activate Range("F2:F8").Copy fp.Activate Range("K3:K9").PasteSpecial xlPasteValues wbkThursday.Close SaveChanges:=False ExitThursday: 

看来你希望你的search从昨天开始,而不是从今天开始。 如果是这样,你可以尝试改变

ThursdayDate = Format(Date - (Weekday(Date, vbThursday) - 1), "mdyy")

 ThursdayDate = Format(Date - (Weekday(Date - 1, vbThursday)), "mdyy") 

并推广到其他星期几。 实际上它现在所做的就是当它运行时,在这个星期四,它查找上个星期四的文件…

上个星期四有一个文件存在,但是我的代码告诉我没有文件

正如我在昨天提出的另一个问题中所解释的那样 ,将vbMondayvbThursday等放在Format函数中并不vbThursday地告诉VBA当天返回:

提示:Weekday函数的vbFriday部分不是神奇地告诉它得到星期五的date。 它实际上是在告诉它,为了这个函数调用,考虑星期五是一周中的第一天。 Weekday函数然后返回从Date减去的整数(星期几)。

所以,你需要回头去了解这些函数是如何工作的,你不能在没有努力理解他们正在做什么或者为什么的情况下在那里乱转常数。 在这个笔记上,你绝对需要阅读这个,并学习如何开始debugging和排除故障 。 这里描述了如何在代码中遍历代码和在运行时检查variables值/ etc的基础知识。 这些技术是您需要使用VBA的基础。

以下是VBA中可用的语句列表。 这是文档解释的东西,如“如何创buildFor/Next等循环结构”

你应该回头看看你在这里提出的十几个问题,并且标记出答案已经解决了你的问题的答案。 这只是礼仪的一个基本点:你在这里问了11个问题,只接受了1个答案。

还要注意的是,这种声明并不符合你的想法:

 Dim LastFridayDate, MondayDate, TuesdayDate, WednesdayDate, ThursdayDate As String Dim fullFileNameLastFriday, fullFileNameMonday, fullFileNameTuesday, fullFileNameWednesday, fullFileNameThursday As String Dim wbkLastFriday, wbkMonday, wbkTuesday, wbkWednesday, wbkThursdayOpen As Workbook 

只有这些语句中的最后一项是强types的,其余的都是隐含的变体。 在可能的情况下,应该强烈键入所有variables,例如:

 Dim wbkLastFriday As Workbook, wbkMonday As Workbook, wbkTuesday As Workbook, wbkWednesday As Workbook, wbkThursdayOpen As Workbook 

而不是使用五个不同的工作簿对象(除非您真的需要一次打开5个工作簿,只需使用一个工作簿对象并在一个循环内运行,在每次迭代中打开连续的文件。

 Dim wb as Workbook Dim i as Long For i = 1 to 5 Set wb = Workbooks.Open(...) 'Do something wb.Close() Next 

解决您的实际问题:

像下面的函数将返回一个数组的date组件。 这将从FirstDay返回前7天(默认为上个星期五)。 您可以像以前一样使用Dir函数来简单地testing文件名是否有效/存在(例如,星期日文件不存在等),如果无效,则跳过该文件。

 Function GetFileNames(Optional FirstDay = vbFriday) Dim filenames(1 To 7) As String Dim i As Long For i = 1 To 7 filenames(i) = Format(Date - (Weekday(Date, FirstDay) + i), "mdyy") Next GetFileNames = filenames End Function