You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:25:38