要准确计算工作日,最稳妥的方法不是死记硬套某个公式,而是提前整理好开始日期、结束日期以及节假日范围,再分别用 WORKDAY 和 DATEDIF 函数处理。前者专门跳过周末和法定节假日,向后推算具体的日期;后者则负责将两个日期之间的间隔拆解为单独的年、月、日。无论是项目排期、入职工龄计算、回款周期统计,还是合同到期提醒,这套组合拳得出的结果,远比单独依赖一个公式硬算更贴合实际业务场景。
这两个函数分工非常明确:WORKDAY 负责向后推算“第几个工作日”落在哪一天,DATEDIF 则专门拆解“已经过去了多长时间”。如果在表格中既要标注任务完成的具体工作日,又要直观显示间隔了多少年、多少月、多少天,将两个函数搭配在同一张表里,是效率最高的做法。
先把日期字段和节假日区域准备好
动手之前,先在表格中摆好三块内容:事项对应的开始日期、目标日期,以及完整的法定节假日清单。常规排版可以这样安排:A 列写具体事项,B 列放开始日期,C 列放结束日期,旁边单独留出一列或一块区域专门存放法定节假日。这里有一个容易踩坑的地方——节假日一定要设置成真正的日期格式,不能存成纯文本。否则公式虽然能输入,但最终计算出的结果很容易出错。
如果这张表是多人共用的,节假日清单最好固定在一个区域,比如 H2:H20,后面所有用到的公式都统一引用这个范围。等到明年放假安排更新时,你只需要修改一次这个区域里的日期,整张表的所有计算结果都会自动刷新,完全不用挨个调整公式,省心省力。
用 WORKDAY 计算指定天数后的工作日
想知道某件事从开始日期往后推 10 个工作日具体是哪一天?直接输入公式 =WORKDAY(B2,10,$H$2:$H$20) 即可。这里的 B2 是开始日期,10 是要向后推算的工作日数量,后面的节假日区域用绝对引用锁定。这个公式返回的不是间隔天数,而是最终对应的具体日期。

如果输入公式后出现一长串数字,不要以为是公式写错了——多半是单元格格式还停留在常规或数值模式。将格式改成短日期或长日期,正常的日期结果就会显示出来。这个小问题在排期表中特别常见,很多第一次计算工作日的人都会卡在这一步。
用 DATEDIF 拆出两个日期之间的年月日
DATEDIF 更适合计算“已经过去了多久”。举个例子,开始日期在 B2,结束日期在 C2,要计算两个日期差了多少整年,就写 =DATEDIF(B2,C2,"Y");计算去掉整年后剩下多少整月,写 =DATEDIF(B2,C2,"YM");计算去掉整年整月后剩下多少天,写 =DATEDIF(B2,C2,"MD")。

在计算员工工龄、合同履约周期、客户服务年限等场景中,DATEDIF 非常好用。与直接把两个日期相减再手动换算相比,它能把结果直接拆成大家容易理解的维度,看表的人一眼就能明白,无需自己重新换算成年月日。
把 WORKDAY 和 DATEDIF 放进同一张排期表
实际使用时,两个函数配合起来更方便。先用 WORKDAY 算出任务的预计完成日期,再用 DATEDIF 统计从开工到结束总共跨越了多长时间。例如,D2 单元格填入预计完成日期:=WORKDAY(B2,E2,$H$2:$H$20),这里 E2 是提前填好的计划工作日数;F2 单元格填入工期说明:=DATEDIF(B2,D2,"D")。如果想要更直观的年月日组合显示,可以直接把 Y、YM、MD 三段的计算结果拼接在一起。

这样设置完成后,表格中既能看到任务最终落在哪个工作日完成,也能查到整个周期总共跨越了多少自然日。做项目跟进、试用期提醒、采购交期核算时,这种双结果展示比只给一个孤零零的日期参考价值高得多。
处理周末规则和常见报错
如果你们公司不是标准双休,而是单休、轮休或固定某一天休息,不要硬套默认参数的 WORKDAY,改用 WORKDAY.INTL 就能自定义周末规则。另一个常见问题是开始日期比结束日期晚,这会导致 DATEDIF 直接报错。遇到这种情况,先核对两个日期的先后顺序,再检查单元格是否被设成了文本格式,干扰了计算。

全部设置完成后,最好拿一个已知结果的样例验证一下。比如选周一作为开始日期,向后推 5 个工作日,看看是否正确避开了周末和节假日。只要样例算出的结果对得上,这套公式就能直接复用到整张表中,后续只需修改具体的事项日期和节假日区域的内容即可。
