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
相关产品推荐
相关产品推荐

