Excel考勤公式-上班与休息日

准备工作

生产环境: Microsoft Office 2026

公式框架: =IF(休息日, "×", "√")

判断逻辑: 若指定日期等于法定休息日,即可判定为休息日。否则,若非法定调班日,且为周六、周日则为休息日。
点击展开流程图
flowchart LR A[开始] --> B{指定日期<br>是否为法定休息日?} B -- 是 --> C[判定:休息日] B -- 否 --> D{是否为法定调班日?} D -- 是 --> E[判定:非休息日] D -- 否 --> F{是否为周六/周日?} F -- 是 --> C F -- 否 --> E

简而言之就是:休息日 = 法定休息日 or 周六、周日(非法定调班日)

根据国务院办公厅关于2026年部分节假日安排的通知_国务院文件_中国政府网,可以创建智能表(其名为"表1"),其中A列标题为 ,B列标题为 ,分别填入规定的休息日和调班的日期,然后在D2单元格输入测试用的日期,比如2026-10-10
点击展开表结构 以2026年为例

2026-01-01 2026-01-04
2026-01-02 2026-02-14
2026-01-03 2026-02-28
2026-02-15 2026-05-09
2026-02-16 2026-09-20
2026-02-17 2026-10-10
2026-02-18
2026-02-19
2026-02-20
2026-02-21
2026-02-22
2026-02-23
2026-04-04
2026-04-05
2026-04-06
2026-05-01
2026-05-02
2026-05-03
2026-05-04
2026-05-05
2026-06-19
2026-06-20
2026-06-21
2026-06-22
2026-09-25
2026-09-26
2026-09-27
2026-10-01
2026-10-02
2026-10-03
2026-10-04
2026-10-05
2026-10-06
2026-10-07

根据以上准备工作,拆分法定休息日的判断公式

一,判断是否为法定休息日

我们可以使用公式=IFNA(MATCH(D2,表1[休],0)>0,FALSE)来判断指定日期是否在法定休息日之列。
点击展开公式解释 公式解释:

  1. MATCH(D2,表1[休],0)

    使用MATCH函数查找D2中的数据,查找源位于"表1"中的"休"列的所有数据,0为精确匹配。

    因为MATCH查找到数据后,会返回一个数字,表示在源中的第几个,所以加上 >0 来让其返回一个逻辑值,找到了当然是大于0(返回TRUE),没找到就会返回一个"#N/A"的错误

  2. IFNA(... , FALSE)

    当MATCH没有找到值的时候,出现"#N/A"的错误时,返回一个FALSE,否则返回 >0的判断(一般就是TRUE了)

整体来说就是,如果找到法定的休息日,就返回TRUE表示指定日期为休息日,否则返回FALSE表示指定日期不在法定休息日之列。

二,判断是否为周六、周日(非法定调班日)

  1. 判断是否为周六、周日

    可以使用公式:=WEEKDAY(D2,2)>5

  2. 判断是否为法定调班日
    调班日 参考休息日的公式为:=IFNA(MATCH(D2,表1[班],0)>0,FALSE)

    为了便于后面的判断,我们需要加上一个NOT来反转此公式,用来确定指定日期非调班日

    非调班日 的公式为:=NOT(IFNA(MATCH(D2,表1[班],0)>0,FALSE))

既要是周六周日又要非法定的调班日,我们可以将两个公式使用AND来结合起来,用来求出周六、周日(非法定调班日)

结合后公式为:=AND(WEEKDAY(D2,2)>5, NOT(IFNA(MATCH(D2,表1[班],0)>0,FALSE)))

完整的判断公式

参考上面讲到的逻辑:休息日 = 法定休息日 or 周六、周日(非法定调班日)

合并上面拆分的两段公式,我们可以得到最终的公式:
=OR(IFNA(MATCH(D2,表1[休],0)>0,FALSE), AND(WEEKDAY(D2,2)>5, NOT(IFNA(MATCH(D2,表1[班],0)>0,FALSE))))

套入公式框架:=IF(OR(IFNA(MATCH(D2,表1[休],0)>0,FALSE), AND(WEEKDAY(D2,2)>5, NOT(IFNA(MATCH(D2,表1[班],0)>0,FALSE)))), "×", "√")

其它说明

逻辑与(AND) 逻辑或(OR) 逻辑非(NOT)
A B