Excel多员工跨月出差日期去重计算天数公式求助
解决Excel中员工有效出差天数计算问题
针对你提到的需求——去重同一员工的重复日期、包含起止日期、处理跨月出差,这里分两种Excel版本给出解决方案,优先推荐新版Excel的简洁公式:
一、适用于Excel 365/2021(支持动态数组和LET函数)
假设你的数据结构是:
- A列:员工ID(如1531)
- B列:出差起始日期(需为Excel日期格式,若当前是文本可先用
=DATEVALUE(B2)转换) - C列:出差结束日期(同格式要求)
计算指定员工(比如员工1531)的有效出差天数,可使用以下公式:
=LET( 目标员工ID, 1531, 员工出差记录, FILTER(A:C, A:A=目标员工ID), 起始日期列, INDEX(员工出差记录,,2), 结束日期列, INDEX(员工出差记录,,3), 所有出差日期, TEXTSPLIT(TEXTJOIN(",",,SEQUENCE(结束日期列-起始日期列+1,1,起始日期列)),","), 去重后日期, UNIQUE(所有出差日期), COUNT(去重后日期) )
公式解释:
目标员工ID:替换成你要计算的员工ID,也可以直接引用单元格(比如A2)实现批量计算员工出差记录:筛选出该员工的所有出差行数据起始日期列/结束日期列:提取筛选结果里的起止日期所有出差日期:把每个出差的日期范围展开成单个日期(比如2018/04/22到2018/05/02会生成从22号到次月2号的所有日期),再合并拆分统一格式去重后日期:去除同一日期的重复记录COUNT(去重后日期):统计最终的有效出差天数
二、适用于旧版Excel(无动态数组支持)
如果你的Excel版本不支持LET和动态数组,可使用以下数组公式(输入完成后需按Ctrl+Shift+Enter触发):
=SUMPRODUCT(1/COUNTIF(INDEX(TEXT(ROW(INDIRECT(MIN(IF(A:A=1531,B:B))&":"&MAX(IF(A:A=1531,C:C)))),"DD/MM/YYYY"),N(IF(1,ROW(INDIRECT(MIN(IF(A:A=1531,B:B))&":"&MAX(IF(A:A=1531,C:C))))-MIN(IF(A:A=1531,B:B))+1))),INDEX(TEXT(ROW(INDIRECT(MIN(IF(A:A=1531,B:B))&":"&MAX(IF(A:A=1531,C:C)))),"DD/MM/YYYY"),N(IF(1,ROW(INDIRECT(MIN(IF(A:A=1531,B:B))&":"&MAX(IF(A:A=1531,C:C))))-MIN(IF(A:A=1531,B:B))+1)))))
注意事项:
- 同样需要确保B/C列是日期格式,文本格式需先转换
- 公式中的
1531可替换为目标员工ID的单元格引用
验证你的示例场景
以员工1531为例:
- 重复录入的2018/04/03会被
UNIQUE(旧版是COUNTIF去重)处理,仅统计1次 - 跨4-5月的出差(2018/04/22至2018/05/02)会被展开为完整的日期序列(共11天),全部计入统计
内容的提问来源于stack exchange,提问作者Rsvraghavan




