因此,我正在通过工作中的大量 Excel 项目学习 VBA。我正在尝试看看我是否可以让我编写的宏在特定时间自动执行。我读过关于如何编写脚本来打开工作表并运行宏的文章。这不是我的问题,尽管我还没有尝试过,但更多的是关于如何在我想要的日子运行它。
我的宏基于其他数据源,因此我需要在同事截止日期后的第二天运行此宏。截止日期是每月的最后一个星期三和倒数第二个星期三。我需要在后一天(星期四)运行我的宏,但如何引用那一天有点棘手。
以下是我试图避免的一些潜在陷阱的示例。
A.) 每月的最后一个星期三也是每月的最后一天。这意味着我的宏需要在每月 1 日运行。
B.) 这个月可能包括 5 个星期三,实际上就像这个月(2023 年 8 月)一样,这意味着我不能依赖“第三”或“第四”个星期三。
有人知道我这些天怎样才能运行我的宏吗?
答案1
您可以用数学计算所有这些,月份、日期是数字,而星期几是常数,如此处所述。
https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/weekday-function
任何月的第一天都很容易,最后一天总是(下个月的第一天)-1
从那里你可以看到今天是星期几,使用上面的参考,如果是 4 你就在那里,如果少于 4,则添加它与 4 之间的天数差,如果超过则减去它。
有关如何进行所有日期计算的参考资料在这里。
https://www.automateexcel.com/vba/date-functions/
从那里,在打开时,确定您希望在哪一天触发它,并确定今天是否是那一天,然后相应地运行。
或者在打开时启动一个计时器,并在该计时器内进行相应的评估和运行。
答案2
答案@GeneMoody-Action1提供的帮助让我找到了这个解决方案。
Function checkIsFinal()
Dim todayDate As Date
Dim prelimDate As Date
Dim finalDate As Date
'Set date variable to last day of month
todayDate = Application.WorksheetFunction.EoMonth(Date, 0)
'Subtract 1 day at a time until selecting the last Wednesday of the month.
Do While Weekday(todayDate) <> 4
todayDate = DateAdd("d", -1, todayDate)
Loop
' Run reports the thursday before for prelim, and the day after for final.
' This allows for the last day to be Wednesday, and the day running the
' report to be into the new month.
finalDate = DateAdd("d", 1, todayDate)
prelimDate = DateAdd("d", -6, todayDate)
todayDate = Date
'Checking to see if today is the date to run the report or not.
If todayDate = prelimDate Then
MsgBox "todayDate = prelimDate"
'Call Forecast1(False, True)
'Call Forecast2(False, True)
ElseIf todayDate = finalDate Then
MsgBox "todayDate = finalDate"
'Call Forecast1(True, True)
'Call Forecast2(True, True)
End If
End Function
这只是一个简单的函数,它允许我在 Excel 中的表单上不需要复选框,并且我可以使用 vbs 脚本和任务计划程序调用此函数,如果日期正确,它将执行需要执行的操作。如果不正确,它将退出。再次感谢您的帮助。