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

Excel WORKDAY函数Holidays参数不接受VBA日期数组问题求助

解决VBA中WORKDAY函数传入Date数组报错的问题

我帮你排查了问题核心:WorksheetFunction.WorkDay的Holidays参数不支持VBA原生的Date类型数组,它需要的是包含日期序列号的Variant数组。虽然VBA的Date本质是存储日期序列号的Double类型,但直接声明为Date数组时,传递给工作表函数会出现类型识别不匹配的问题。

最简解决方案:将数组改为Variant类型

只需要把你的Holidays数组声明从Date改成Variant,就能让WORKDAY函数正确识别数组中的日期值:

Function WorkDayFiveA(DateofSpend As Date) As Boolean
    Dim WDFive As Date, RefDate As Date
    ' 把Date数组改为Variant数组,让工作表函数能正确解析日期
    Dim Holidays(9) As Variant
    Dim wf As WorksheetFunction
    
    ' 加载节假日数组(赋值逻辑保持不变)
    Holidays(0) = DateSerial(Year(Date) - 1, 12, 25) ' 去年圣诞节
    Holidays(1) = DateSerial(Year(Date) - 1, 12, 26) ' 去年节礼日
    Holidays(2) = DateSerial(Year(Date), 1, 1) ' 新年
    Holidays(3) = EasterDate(Year(Date), 1) ' 耶稣受难日
    Holidays(4) = EasterDate(Year(Date), 2) ' 复活节星期一
    Holidays(5) = PublicHolidayDate(Year(Date), 1) ' 五月节
    Holidays(6) = PublicHolidayDate(Year(Date), 2) ' 春假
    Holidays(7) = PublicHolidayDate(Year(Date), 3) ' 春假
    Holidays(8) = DateSerial(Year(Date), 12, 25) ' 今年圣诞节
    Holidays(9) = DateSerial(Year(Date), 12, 26) ' 今年节礼日
    
    Set wf = Application.WorksheetFunction
    ' 现在可以正常调用WORKDAY函数了
    WDFive = wf.WorkDay(DateSerial(Year(Date), Month(Date), 1), 4, Holidays)
    
    If Date < WDFive Then
        RefDate = DateSerial(Year(WDFive), Month(WDFive) - 1, 1)
    Else
        RefDate = DateSerial(Year(WDFive), Month(WDFive), 1)
    End If
    
    WorkDayFiveA = (DateofSpend < RefDate)
End Function

补充可选方案

如果你坚持想用Date数组,也可以手动将每个Date元素转换为Double(即日期序列号)后传递,比如:

Holidays(0) = CDbl(DateSerial(Year(Date) - 1, 12, 25))

不过改成Variant数组是更简洁且易维护的方案。

另外,也可以考虑使用Application.WorkDay代替WorksheetFunction.WorkDay,前者遇到错误时会返回错误值(如#VALUE!)而非直接抛出运行时错误,方便后续做错误处理。

内容的提问来源于stack exchange,提问作者silvabak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:03:53