VBA中WorkDay配合EoMonth函数无法正确返回上月最后工作日
问题根因
两种错误写法的逻辑缺陷如下:
- 第一种写法
WorkDay(EoMonth(ReportDate,-1),0,ArrHolidays):先取到上月最后一天2022/4/30(周六),但WorkDay函数第二个参数传0时,代表不做任何日期偏移,无论起始日期是否为周末/节假日,都会直接返回起始日本身,因此返回了不符合要求的周六日期。 - 第二种写法
EoMonth(WorkDay(ReportDate,-1,ArrHolidays),-1):逻辑完全偏离需求,先取报表日期前1个工作日,再取该日期往前1个月的月末日期,全程没有对上月月末做工作日校验,自然返回2022/4/30。
正确实现代码
要获取指定月份的最后一个工作日,通用逻辑是:从目标月份的下一月第一天开始,往回偏移1个工作日,函数会自动跳过周末和配置的节假日,不会出现参数为0时不校验日期属性的问题。
对应VBA代码如下:
PnLD1WS.Cells(i, 159).Value = Application.WorksheetFunction.WorkDay( _ Application.WorksheetFunction.EoMonth(ReportDate, -1) + 1, _ -1, _ ArrHolidays _ )
逻辑验证
以传入参数ReportDate=2022/5/31为例:
EoMonth(ReportDate, -1)计算得到上月最后一天2022/4/30- 加1天得到次月首日2022/5/1
WorkDay以2022/5/1为起点,往回找第1个工作日,自动跳过周末、ArrHolidays中配置的节假日,只要2022/4/29不在节假日列表中,就会正确返回预期结果2022/4/29。
注意:需确保
ArrHolidays数组中完整录入了所有需要排除的法定节假日、公司自定义休息日,否则计算结果会和预期存在偏差。
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

