Excel vba - 使用变量(日期)文件名打开文件

时间:2017-04-20 13:32:45

标签: excel vba excel-vba

我有以下代码打开带有可变文件名的文件,因为日期在其中。我个人每天用日期戳保存每个文件,即今天早上我保存了一个昨天日期为4.20.17的文件。

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

目前,代码设置为告诉我文件何时不存在(例如,上周五是耶稣受难日,所以星期一早上,我没有为上周五创建任何文件),然后忽略并移过该文件一天。

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

感谢任何帮助。我删除了几天,使下面的代码少了一个熊来看,一个示例文件名是“Agent Group Daily Summary 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), "m.d.yy")
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), "m.d.yy")
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), "m.d.yy")
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:

2 个答案:

答案 0 :(得分:2)

  

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

作为I explained in the other question you asked yesterday,将vbMondayvbThursday等放入Format函数并不会让VBA神奇地告诉那一天:

  

提示:工作日功能的vbFriday部分并没有神奇地告诉它星期五的日期。它实际上告诉它,为了这个函数调用,考虑星期五是一周的第一天。然后Weekday函数返回一个整数(一周的序数日),它从Date中减去。

所以,你需要回过头来理解这些函数是如何工作的,你不能只是在不知道他们正在做什么或为什么这么做的情况下在那里甩掉常量。在这方面,你绝对需要read this and learn how to begin debugging and troubleshooting first。这描述了如何在运行时单步执行代码并检查变量值/等的基础知识。这些技术是您使用VBA所需的基础。

Here是VBA中可用的语句列表。这个文档解释了“如何使用For/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

只有每个语句中的最后一项都是强类型的,其余的都是隐式变体。您应该尽可能强烈地键入所有变量,例如:

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

了解您的实际问题:

如下所示的函数将返回日期组件的数组。这将返回 FirstDay 之前的7天(默认为星期五之前)。您可以像以前一样使用Dir函数来简单地测试文件名是否有效(例如,星期日文件不存在等),如果它无效则跳过它。

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), "m.d.yy")
Next
GetFileNames = filenames
End Function

答案 1 :(得分:1)

您希望搜索从昨天开始而不是今天。如果是这样,您可以尝试更改

  

ThursdayDate = Format(Date - (Weekday(Date, vbThursday) - 1), "m.d.yy")

ThursdayDate = Format(Date - (Weekday(Date - 1, vbThursday)), "m.d.yy")

并将其概括为其他工作日。事实上它现在所做的是,当它运行时,例如,在这个星期四,它会查找 last 星期四的文件......