题目案例:

题目:对A列的日期判定当月的天数
告别手动算天数!PMC排产必备的神技:1秒搞定全月工作日计算​

整体结论:

排名公式核心函数组合思路简述核心知识点特点
1DAY(EOMONTH(A列,0))直接定位月末日:用EOMONTH获取当月最后一天 → DAY提取天数EOMONTH(月末函数) + 数组溢出 ✅ months=0表示当月最简最优解
2DAY(DATE(YEAR(A列),MONTH(A列)+1,0))日期边界技巧:构造下月第0天 → Excel自动退为本月最后一天 → DAY提数DATEday=0回退机制 ✅ MONTH+1跨月边界计算🕰️ 经典替代方案
3LET+SEQUENCE+GROUPBY+VLOOKUP暴力枚举法:生成10年日期 → 按月分组统计行数 → 反查匹配⚠️ SEQUENCE(生成序列) ⚠️ GROUPBY(聚合统计) ⚠️ VLOOKUP反向匹配🐢 低效教学案例

公式一:直接定位法

告别手动算天数!PMC排产必备的神技:1秒搞定全月工作日计算​
  1. 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): 公式中对 EOMONTHDAY 的输入都是一个单元格区域 A2:A21。在现代Excel(支持动态数组的版本,如MS 365, Excel 2021)中,这允许公式自动将结果“溢出”(Spill)到对应的 B2:B21 区域,一次性计算出所有行对应的结果。

总结公式:

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

公式二:日期边界法

告别手动算天数!PMC排产必备的神技:1秒搞定全月工作日计算​
  1. B2=DAY(DATE(YEAR(A2:A21),MONTH(A2:A21)+1,0))

解法思路:

拼凑一个“下月第0天”的日期: 使用 DATE(year, month, day) 函数。参数提取方式如下:year = YEAR(A2:A21):获取原始日期对应的年份。month = MONTH(A2:A21) + 1:获取原始日期对应的月份,并加 1(即计算下个月)。day = 0:这是关键技巧!在 DATE 函数中,day 参数设置为 0 会被解释为指定月份(即month参数计算的月份)的前一天的日期。“下月第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): 同公式一,利用动态数组溢出功能一次性计算区域结果。总结: 这是一个历史悠久的技巧,在没有 EOMONTH 函数的早期Excel版本中使用。它巧妙地利用了 DATE 函数处理第 0 天的特殊规则来获取月末日期,再结合 DAY 提取天数。效果与公式一相同,但需要理解这个特殊规则,且公式稍长。

总结公式:

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

公式三:聚合引用法

告别手动算天数!PMC排产必备的神技:1秒搞定全月工作日计算​
  1. 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)--A2:将 A2 单元格的日期(或文本)转换为数值(序列值)。确保计算起点。SEQUENCE(3650,, start_value):生成一个包含 3650 个连续数字的数组(代表3650天),起始值为 --A2(即第一个数据的日期序列值)。定义变量 B (每月的第一天): B = DATE(YEAR(A), MONTH(A), 1):对序列 A 中的每一个日期序列值,计算其所在月份的第一天日期(DATE(年, 月, 1))。聚合计算每月天数: GROUPBY(B, B, COUNTA)GROUPBY(row_fields, [values], [function], ...):将生成的日期序列 B(每月第一天)作为行字段和值字段。COUNTA:对同一月份第一天(即同一个 B)出现的次数进行计数。B 序列包含了3650天的每月第一天,这个计数结果就是该月的总天数(因为在该月的每一天,这个“当月第一天”的值都是相同的)。结果是一个两列数组:第一列是月份第一天 (B),第二列是该月的天数 (COUNTA)。查找原始日期对应的月天数: VLOOKUP(--A2:A21, groupby_result, 2, 0)--A2:A21:将原始数据区域转换为日期序列值(查找值)。groupby_result:上一步 GROUPBY 生成的表格(两列数组)。2:表示在 GROUPBY 结果中取第二列(天数)。0:表示精确匹配 (FALSE)。VLOOKUP 将查找原始日期(序列值),在 GROUPBY 生成的结果表中找到对应的月份第一天所在的行,并返回该行第二列的值(即该月的天数)。“溢出”结果: 整个 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 结果。复杂度与效率: 该方法极其复杂、低效且不必要。它绕了一大圈:生成大量日期 -> 提取月份第一天 -> 聚合计数天数 -> 再反查原始日期对应的天数。其真正价值可能在于演示 LETSEQUENCEGROUPBY 的组合使用场景(一个非常低效的场景)。

总结公式

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

关键对比结论

效率优先级公式1公式2公式3(直接计算 → 巧用规则 → 遍历统计)实用场景日常办公公式1(需Excel 2007+)⚠️ 兼容旧版公式2(Excel 2003+通用)🔬 函数教学公式3(演示GROUPBY动态聚合)

相关新闻

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

立即咨询 企业版试用 上门服务

请您留言

感谢您的关注,你可留下联系方式,我们将第一时间与您联系。