【问题标题】:Excel vba - Open files with variable (dates) filenamesExcel vba - 打开具有可变(日期)文件名的文件
【发布时间】:2017-09-17 04:17:30
【问题描述】:

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

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

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

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

感谢您提供任何帮助。我删除了几天以使下面的代码不那么难看,示例文件名为“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:

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    上周四的文件存在,但我的代码告诉我不存在

    作为I explained in the other question you asked yesterday,将vbMondayvbThursday 等放在Format 函数中不会神奇地告诉VBA 当天返回:

    提示:Weekday 函数的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
    

    【讨论】:

    • 谢谢大卫。我对该网站还很陌生,所以我不明白复选标记。我知道如何调试;问题不是我不知道如何调试,而是我不明白问题是什么以及为什么会发生。 VBA 对我来说仍然相当陌生。我可以做的任何事情来让代码运行得更快,而不是像我想做的那样长,但最终,它只会被我使用,只需要完成工作。我也将其用作学习。
    • 支持“礼仪基本点”。不,开个玩笑:P,尊重指导性和详细的答案。
    【解决方案2】:

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

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

    进入

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

    并将其推广到其他工作日。实际上,它现在所做的是,当它运行时,例如,在 this Thursday,它会查找 last Thursday...

    的文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      相关资源
      最近更新 更多