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

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为例:

  1. EoMonth(ReportDate, -1)计算得到上月最后一天2022/4/30
  2. 加1天得到次月首日2022/5/1
  3. WorkDay以2022/5/1为起点,往回找第1个工作日,自动跳过周末、ArrHolidays中配置的节假日,只要2022/4/29不在节假日列表中,就会正确返回预期结果2022/4/29。

注意:需确保ArrHolidays数组中完整录入了所有需要排除的法定节假日、公司自定义休息日,否则计算结果会和预期存在偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:09:28