Excel公式求助:跨月培训时段自动分月扣减工作日(含节假日)
嗨,我完全懂你的需求——不用手动把跨月培训日期拆成单日填表格,就能自动按月份扣减对应工作日,对吧?给你整理了两个实用方案,新手也能轻松上手:
方案一:直接计算每月扣减天数(无需拆分日期,全Excel版本通用)
这个方案不用拆分任何日期,直接通过公式计算每个月和培训范围的重叠工作日,然后从原结果里扣减,最省心。
假设你的表格结构是这样的:
- A列:每个月的起始日期(比如A6是
2024/8/1,A7是2024/9/1,以此类推) - B列:你原来的每月工作日计算公式:
=NETWORKDAYS($A6,EOMONTH($A6,0),holidays!$C$4:$C$13) - D1单元格:培训开始日期(比如
2024/8/15) - E1单元格:培训结束日期(比如
2024/9/25)
在C列(用来放扣减后的最终工作日),输入以下公式,然后下拉填充到所有月份行:
=B6 - IF(MAX($A6, $D$1) > MIN(EOMONTH($A6,0), $E$1), 0, NETWORKDAYS(MAX($A6, $D$1), MIN(EOMONTH($A6,0), $E$1), holidays!$C$4:$C$13))
公式简单解释:
MAX($A6, $D$1):取「当月第一天」和「培训开始日」里更晚的那个,作为该月内培训的实际起始日期MIN(EOMONTH($A6,0), $E$1):取「当月最后一天」和「培训结束日」里更早的那个,作为该月内培训的实际结束日期- 如果前者大于后者,说明这个月和培训范围完全不重叠,扣减0;否则用
NETWORKDAYS计算这个重叠区间的工作日(同样扣除你指定的节假日),再从原工作日结果里减去这个数。
方案二:可视化拆分日期范围(适合Excel 365/2021)
如果你希望把培训的所有日期都拆出来可视化查看,可以用Excel的动态数组函数来自动生成日期序列,再按月份统计扣减天数。
- 生成培训日期序列:
在空白列(比如F列)输入以下公式,会自动生成从培训开始到结束的所有日期:
=SEQUENCE($E$1 - $D$1 + 1, 1, $D$1)
- 匹配每个日期所属的月份:
在F列旁边的G列,输入公式,给每个日期标记所属月份的第一天(方便后续按月份统计):
=DATE(YEAR(F2), MONTH(F2), 1)
Excel 365会自动溢出填充,不用手动下拉;旧版本则需要下拉填充到所有拆分出的日期行。
- 计算每个月需扣减的培训工作日:
回到你的月份计算行,在C列输入以下公式,下拉填充:
=B6 - SUMPRODUCT(--(NETWORKDAYS.INTL(F:F, F:F, 1, holidays!$C$4:$C$13)=1), --(G:G=$A6))
公式简单解释:
NETWORKDAYS.INTL(F:F, F:F, 1, holidays!$C$4:$C$13)=1:判断拆分出的每个日期是否是工作日(非节假日),返回TRUE/FALSE,用--转成1/0G:G=$A6:判断日期是否属于当前行的月份,同样转成1/0SUMPRODUCT把两个数组相乘后求和,得到该月内培训的工作日总数,再从原工作日结果里减去这个数。
几个关键注意事项
- 确保D1、E1以及节假日区域
holidays!$C$4:$C$13的单元格都是日期格式,不是文本格式,否则公式会出错 - 如果是Excel 2019及更早版本,没有
SEQUENCE函数,优先用方案一 - 若有多个培训范围,可以把公式里的
$D$1和$E$1改成对应的单元格,新手先从单个范围入手更稳妥
内容的提问来源于stack exchange,提问作者sinensys
相关产品推荐
相关产品推荐

