算准工作日,最稳妥的办法不是硬写单个公式,而是先把开始日期、结束日期、节假日范围提前整理好,用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个工作日,看看是不是正确避开了周末和节假日。只要样例算出来的结果对得上,这套公式直接就能复用整张表,后面只要改具体的事项日期和节假日区域的内容就行。


















