告别手动算天数!PMC排产必备的神技:1秒搞定全月工作日计算
题目案例:
整体结论:
排名 | 公式核心函数组合 | 思路简述 | 核心知识点 | 特点 |
1 | DAY(EOMONTH(A列,0)) | 直接定位月末日:用EOMONTH获取当月最后一天→ DAY提取天数 | ✅ EOMONTH(月末函数) + 数组溢出 ✅ months=0表示当月 | ⚡ 最简最优解 |
2 | DAY(DATE(YEAR(A列),MONTH(A列)+1,0)) | 日期边界技巧:构造下月第0天 → Excel自动退为本月最后一天 → DAY提数 | ✅ DATE的day=0回退机制✅ MONTH+1跨月边界计算 | 🕰️ 经典替代方案 |
3 | LET+SEQUENCE+GROUPBY+VLOOKUP | 暴力枚举法:生成10年日期 → 按月分组统计行数 → 反查匹配 | ⚠️ SEQUENCE(生成序列) ⚠️ GROUPBY(聚合统计) ⚠️ VLOOKUP反向匹配 | 🐢 低效教学案例 |
公式一:直接定位法
B2=DAY(EOMONTH(A2:A21,0))
获取月底日期: 使用EOMONTH(start_date, months) 函数。A2:A21 作为起始日期(start_date),0 表示从起始日期所在的月份开始偏移0 个月,也就是直接计算该月的最后一天的日期。
提取天数: 使用DAY(date) 函数。将EOMONTH 函数返回的日期作为输入,DAY 函数会返回该日期在月份中的天数,也就是该月的总天数。
|
EOMONTH 函数: 核心函数。用途是返回指定日期在偏移指定月份数后的该月最后一天的日期。关键参数months=0 表示不偏移月份,计算起始日期当月的最后一天。这是最直接获取月末日期的函数。
DAY 函数: 用于从日期序列中提取该日期是当月的第几天(1-31)。当输入是月末日期时,它返回的就是该月的总天数。
数组输入 (A2:A21): 公式中对EOMONTH 和DAY 的输入都是一个单元格区域A2:A21。在现代Excel(支持动态数组的版本,如MS 365, Excel 2021)中,这允许公式自动将结果“溢出”(Spill)到对应的 B2:B21 区域,一次性计算出所有行对应的结果。
|
这是最简洁、最高效的方法。直接利用EOMONTH 函数找到月底,再用DAY 提取天数,思路清晰直接。 |
公式二:日期边界法
B2=DAY(DATE(YEAR(A2:A21),MONTH(A2:A21)+1,0))
拼凑一个“下月第0天”的日期: 使用DATE(year, month, day) 函数。参数提取方式如下:
“下月第0天”就是本月的最后一天: DATE(YEAR(A2:A21), MONTH(A2:A21)+1, 0) 实际构造的是下个月份的第0天。Excel将第0天解释为上一个月的最后一天。所以这步操作相当于直接构造了原始日期所在月份的最后一天。
提取天数: 使用DAY(date) 函数获取这个构造出来的月末日期是几号。
|
DATE 函数: 用于根据给定的年、月、日构造一个日期。
YEAR/MONTH 函数: 用于从日期中提取年份和月份。
DATE 函数day 参数为0 的特殊行为: 这是该公式的核心技巧。DATE(year, month, 0) 返回month 月份的前一个月的最后一天的日期。
日期计算逻辑: 理解month+1 结合day=0 实际得到的是上个月(即目标月)的最后一天。
数组输入 (A2:A21): 同公式一,利用动态数组溢出功能一次性计算区域结果。
|
经典替代方案。效果同公式一,稍冗长,需理解DAY=0的技巧。在旧版Excel或需要兼容时可用。 |
公式三:聚合引用法
B2=LET(A,SEQUENCE(3650,,--A2),B,DATE(YEAR(A),MONTH(A),1),VLOOKUP(--A2:A21,GROUPBY(B,B,COUNTA),2,0))
定义变量 A (日期序列): A = SEQUENCE(3650,, --A2):
定义变量 B (每月的第一天): B = DATE(YEAR(A), MONTH(A), 1):
聚合计算每月天数: GROUPBY(B, B, COUNTA):
查找原始日期对应的月天数: VLOOKUP(--A2:A21, groupby_result, 2, 0):
“溢出”结果: 整个LET 公式定义变量的操作在动态数组支持下,会自动将VLOOKUP 的结果填充到B2:B21。
|
LET 函数: 用于定义局部变量 (A, B) 和计算结果表达式。提高公式可读性(本例中效果有限)和避免重复计算。
SEQUENCE 函数: 创建数字序列。此处用于模拟一个连续的日子序列(3650天)。
-- (双负号) 强制类型转换: 用于确保日期被当作数字(序列值)处理。
YEAR/MONTH/DATE 函数: 用于日期处理(同公式二)。
GROUPBY 函数 (新函数): 强大的分组聚合函数(类似于数据透视表操作)。这里用于按“月份第一天”分组并计数(计算天数)。
COUNTA 函数: 用于GROUPBY 中对分组内的元素计数。这里的“元素”都是同一个“月份第一天”重复出现,每个月的“月份第一天”出现的次数就等于该月的天数。
VLOOKUP 函数: 经典的查找函数。用于在GROUPBY 生成的天数表中查找原始日期对应的天数。
日期序列值: Excel 内部将日期存储为数字(从1900-01-01开始的序列号)。
数组操作与动态数组: 整个公式依赖现代Excel对数组公式的强大支持(动态溢出)。涉及处理多个数组:A, B, GROUPBY 结果。
复杂度与效率: 该方法极其复杂、低效且不必要。它绕了一大圈:生成大量日期 -> 提取月份第一天 -> 聚合计数天数 -> 再反查原始日期对应的天数。其真正价值可能在于演示 LET、SEQUENCE 和GROUPBY 的组合使用场景(一个非常低效的场景)。
|
(SEQUENCE,溢出)和新的聚合函数GROUPBY 的使用方式。它通过构建一个时间范围来统计每月天数,然后再反向匹配原始日期。聚合加查找引用的经典方法 |
关键对比结论
效率优先级
公式1 → 公式2 → 公式3 (直接计算→ 巧用规则 → 遍历统计) 实用场景
|