告别手动算天数!PMC排产必备的神技:1秒搞定全月工作日计算

古哥计划

优秀创作者

题目案例:

题目:对A列的日期判定当月的天数

整体结论:

排名

公式核心函数组合

思路简述

核心知识点

特点

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反向匹配

🐢 低效教学案例

公式一:直接定位法

  1. B2=DAY(EOMONTH(A2:A21,0))


  • 解法思路:
  1. 获取月底日期: 使用EOMONTH(start_date, months) 函数。A2:A21 作为起始日期(start_date),0 表示从起始日期所在的月份开始偏移0 个月,也就是直接计算该月的最后一天的日期。

  1. 提取天数: 使用DAY(date) 函数。将EOMONTH 函数返回的日期作为输入,DAY 函数会返回该日期在月份中的天数,也就是该月的总天数。

  • 核心知识:
  1. EOMONTH 函数: 核心函数。用途是返回指定日期在偏移指定月份数后的该月最后一天的日期。关键参数months=0 表示不偏移月份,计算起始日期当月的最后一天。这是最直接获取月末日期的函数

  1. DAY 函数: 用于从日期序列中提取该日期是当月的第几天(1-31)。当输入是月末日期时,它返回的就是该月的总天数。

  1. 数组输入 (A2:A21): 公式中对EOMONTH 和DAY 的输入都是一个单元格区域A2:A21。在现代Excel(支持动态数组的版本,如MS 365, Excel 2021)中,这允许公式自动将结果“溢出”(Spill)到对应的 B2:B21 区域,一次性计算出所有行对应的结果。

  • 总结公式:

这是最简洁、最高效的方法。直接利用EOMONTH 函数找到月底,再用DAY 提取天数,思路清晰直接。

公式二:日期边界法

  1. B2=DAY(DATE(YEAR(A2:A21),MONTH(A2:A21)+1,0))


  • 解法思路:
  1. 拼凑一个“下月第0天”的日期: 使用DATE(year, month, day) 函数。参数提取方式如下:

  • year = YEAR(A2:A21):获取原始日期对应的年份。

  • month = MONTH(A2:A21) + 1:获取原始日期对应的月份,并加1(即计算下个月)。

  • day = 0:这是关键技巧!在DATE 函数中,day 参数设置为0 会被解释为指定月份(即month参数计算的月份)的前一天的日期。

  1. “下月第0天”就是本月的最后一天: DATE(YEAR(A2:A21), MONTH(A2:A21)+1, 0) 实际构造的是下个月份的第0天。Excel将第0天解释为上一个月的最后一天。所以这步操作相当于直接构造了原始日期所在月份的最后一天。

  1. 提取天数: 使用DAY(date) 函数获取这个构造出来的月末日期是几号。

  • 核心知识:
  1. DATE 函数: 用于根据给定的年、月、日构造一个日期。

  1. YEAR/MONTH 函数: 用于从日期中提取年份和月份。

  1. DATE 函数day 参数为0 的特殊行为: 这是该公式的核心技巧。DATE(year, month, 0) 返回month 月份的前一个月的最后一天的日期。

  1. 日期计算逻辑: 理解month+1 结合day=0 实际得到的是上个月(即目标月)的最后一天。

  1. 数组输入 (A2:A21): 同公式一,利用动态数组溢出功能一次性计算区域结果。

  • 总结: 这是一个历史悠久的技巧,在没有EOMONTH 函数的早期Excel版本中使用。它巧妙地利用了 DATE 函数处理第0 天的特殊规则来获取月末日期,再结合DAY 提取天数。效果与公式一相同,但需要理解这个特殊规则,且公式稍长。

  • 总结公式:

经典替代方案。效果同公式一,稍冗长,需理解DAY=0的技巧。在旧版Excel或需要兼容时可用。

公式三:聚合引用法

  1. B2=LET(A,SEQUENCE(3650,,--A2),B,DATE(YEAR(A),MONTH(A),1),VLOOKUP(--A2:A21,GROUPBY(B,B,COUNTA),2,0))


  • 解法思路:
  1. 定义变量 A (日期序列): A = SEQUENCE(3650,, --A2):

  • --A2:将A2 单元格的日期(或文本)转换为数值(序列值)。确保计算起点。

  • SEQUENCE(3650,, start_value):生成一个包含 3650 个连续数字的数组(代表3650天),起始值为 --A2(即第一个数据的日期序列值)。

  1. 定义变量 B (每月的第一天): B = DATE(YEAR(A), MONTH(A), 1):

  • 对序列A 中的每一个日期序列值,计算其所在月份的第一天日期(DATE(年, 月, 1))。

  1. 聚合计算每月天数: GROUPBY(B, B, COUNTA):

  • GROUPBY(row_fields, [values], [function], ...):将生成的日期序列B(每月第一天)作为行字段和值字段。

  • COUNTA:对同一月份第一天(即同一个B)出现的次数进行计数。B 序列包含了3650天的每月第一天,这个计数结果就是该月的总天数(因为在该月的每一天,这个“当月第一天”的值都是相同的)。结果是一个两列数组:第一列是月份第一天 (B),第二列是该月的天数 (COUNTA)。

  1. 查找原始日期对应的月天数: VLOOKUP(--A2:A21, groupby_result, 2, 0):

  • --A2:A21:将原始数据区域转换为日期序列值(查找值)。

  • groupby_result:上一步GROUPBY 生成的表格(两列数组)。

  • 2:表示在GROUPBY 结果中取第二列(天数)。

  • 0:表示精确匹配 (FALSE)。

  • VLOOKUP 将查找原始日期(序列值),在GROUPBY 生成的结果表中找到对应的月份第一天所在的行,并返回该行第二列的值(即该月的天数)。

  1. “溢出”结果: 整个LET 公式定义变量的操作在动态数组支持下,会自动将VLOOKUP 的结果填充到B2:B21。

  • 核心知识
  1. LET 函数: 用于定义局部变量 (A, B) 和计算结果表达式。提高公式可读性(本例中效果有限)和避免重复计算。

  1. SEQUENCE 函数: 创建数字序列。此处用于模拟一个连续的日子序列(3650天)。

  1. -- (双负号) 强制类型转换: 用于确保日期被当作数字(序列值)处理。

  1. YEAR/MONTH/DATE 函数: 用于日期处理(同公式二)。

  1. GROUPBY 函数 (新函数): 强大的分组聚合函数(类似于数据透视表操作)。这里用于按“月份第一天”分组并计数(计算天数)。

  1. COUNTA 函数: 用于GROUPBY 中对分组内的元素计数。这里的“元素”都是同一个“月份第一天”重复出现,每个月的“月份第一天”出现的次数就等于该月的天数。

  1. VLOOKUP 函数: 经典的查找函数。用于在GROUPBY 生成的天数表中查找原始日期对应的天数。

  1. 日期序列值: Excel 内部将日期存储为数字(从1900-01-01开始的序列号)。

  1. 数组操作与动态数组: 整个公式依赖现代Excel对数组公式的强大支持(动态溢出)。涉及处理多个数组:A, B, GROUPBY 结果。

  1. 复杂度与效率: 该方法极其复杂、低效且不必要。它绕了一大圈:生成大量日期 -> 提取月份第一天 -> 聚合计数天数 -> 再反查原始日期对应的天数。其真正价值可能在于演示 LET、SEQUENCE 和GROUPBY 的组合使用场景(一个非常低效的场景)。

  • 总结公式

(SEQUENCE,溢出)和新的聚合函数GROUPBY 的使用方式。它通过构建一个时间范围来统计每月天数,然后再反向匹配原始日期。聚合加查找引用的经典方法

关键对比结论

  1. 效率优先级

公式1公式2公式3

(直接计算→ 巧用规则 → 遍历统计)

  1. 实用场景

  • 日常办公公式1(需Excel 2007+)

  • ⚠️ 兼容旧版公式2(Excel 2003+通用)

  • 🔬 函数教学公式3(演示GROUPBY动态聚合)

广东省
浏览 92
收藏
4
分享
4 +1
1
+1
全部评论 1
 
学习
· 广东省
回复