VBA需求:若前一日为银行假日,打开前一个工作日的文件
如何在VBA代码中加入银行/公共假日逻辑获取前一个工作日?
嘿,我完全懂你的困扰——原来的代码只处理了周末的情况,但碰到像复活节周五这种银行假日就失效了对吧?这确实是个很常见的需求,我来给你分享几个实用的解决方案,帮你完美解决这个问题。
方案1:手动维护假日列表(适合假日数量少的场景)
这种方法最简单直接,把所有需要排除的银行假日存到一个数组里,然后循环往前查找,直到找到一个既不是周末也不在假日列表里的日期。
先写一个自定义函数来处理日期判断:
Function GetPreviousWorkday(inputDate As Date) As Date Dim holidayList As Variant Dim prevDay As Date Dim isHoliday As Boolean ' 这里手动添加你的银行假日,格式为#mm/dd/yyyy#,按需增减 holidayList = Array(#3/30/2018#, #12/25/2018#, #1/1/2019#, #1/21/2019#) prevDay = inputDate - 1 ' 先默认往前推一天 ' 循环检查:只要是周末或假日,就继续往前找 Do While True ' 先判断是否是周末(vbSunday=1,vbSaturday=7) If Weekday(prevDay, vbSunday) = 1 Or Weekday(prevDay, vbSunday) = 7 Then prevDay = prevDay - 1 Else ' 检查当前日期是否在假日列表中 isHoliday = False For Each holiday In holidayList If prevDay = holiday Then isHoliday = True Exit For End If Next holiday ' 如果不是假日,就跳出循环返回结果 If Not isHoliday Then Exit Do Else prevDay = prevDay - 1 End If End If Loop GetPreviousWorkday = prevDay End Function
然后把你原来的代码替换成下面这样,调用这个函数就行:
Dim targetWorkday As Date targetWorkday = GetPreviousWorkday(Date) Workbooks.Open Filename:= _ "filepath" & Format(targetWorkday, "yymmdd") & " - filename.xlsx"
方案2:用Excel工作表存储假日(适合假日多或需要频繁更新的场景)
如果你的假日列表经常变动,或者数量很多,把假日存在一个单独的工作表里会更方便维护。比如新建一个名为Holidays的工作表,在A列逐行输入所有假日日期。
对应的自定义函数如下:
Function GetPreviousWorkdayFromSheet(inputDate As Date) As Date Dim ws As Worksheet Dim holidayRange As Range Dim prevDay As Date Dim cell As Range Dim isHoliday As Boolean ' 指向存储假日的工作表 Set ws = ThisWorkbook.Worksheets("Holidays") ' 动态获取A列的假日范围(自动识别最后一行数据) Set holidayRange = ws.Range("A1:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row) prevDay = inputDate - 1 Do While True ' 先判断是否是周末 If Weekday(prevDay, vbSunday) = 1 Or Weekday(prevDay, vbSunday) = 7 Then prevDay = prevDay - 1 Else ' 检查当前日期是否在工作表的假日列表中 On Error Resume Next ' 防止找不到匹配时触发错误 Set cell = holidayRange.Find(prevDay, LookIn:=xlValues, LookAt:=xlWhole) On Error GoTo 0 ' 恢复错误处理 isHoliday = Not (cell Is Nothing) If Not isHoliday Then Exit Do Else prevDay = prevDay - 1 End If End If Loop GetPreviousWorkdayFromSheet = prevDay End Function
调用方式和方案1一样,只需要把函数名换成GetPreviousWorkdayFromSheet就行。
额外说明
如果需要处理像复活节这种日期不固定的假日,你可能需要额外的逻辑来计算这些动态假日的日期,但不同地区的规则差异很大,手动维护或者用工作表存储依然是最灵活的方案——毕竟你可以根据自己所在地区的实际情况随时更新假日列表。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

