求助:Excel中基于文本月份创建滚动12M平均计算标记列
解决Excel文本月份的滚动12M标记问题
这问题我之前也碰到过,用固定天数偏移(比如curr-395)确实容易踩坑——毕竟不同月份天数不同,还有闰年的影响,换用Excel的EDATE函数就能完美规避这个误差,给你一步步拆解解决方案:
核心思路
放弃用天数计算月份偏移,改用基于月份数的偏移函数EDATE,它会直接按整月数调整日期,完全不受每月天数、闰年的影响。
具体实现方法
方法1:先转换月份文本为日期(适合所有Excel版本)
转换月份文本为日期值:
在C列(或任意空白列)输入公式,把B2的YYYY-MM文本转为该月第一天的日期值:=DATE(LEFT(B2,4), RIGHT(B2,2), 1)(比
DATEVALUE(B2&"-01")更稳定,能避免部分地区日期格式的兼容性问题)定义当前月基准日期:
在某个空白单元格(比如D1)输入公式,获取当前日期所在月份的第一天:=DATE(YEAR(TODAY()), MONTH(TODAY()), 1)假设当前日期是2018/5/24,这里会得到
2018-05-01,我们把它作为基准值curr。生成Flag列:
在目标列输入公式,按需求标记:=IF(C2=$D$1,"Current", IF(AND(C2>=EDATE($D$1,-12),C2<=EDATE($D$1,-1)),"Both", IF(C2=EDATE($D$1,-13),"Previous","NA") ) )下拉填充即可得到符合要求的标记结果。
方法2:用LET函数简化(Excel 365及以后版本)
如果用的是Excel 365或更高版本,用LET函数可以把重复计算的部分封装成变量,让公式更简洁易读,不用额外的转换列:
=LET( curr_month, DATE(YEAR(TODAY()), MONTH(TODAY()), 1), cell_month, DATE(LEFT(B2,4), RIGHT(B2,2), 1), IF(cell_month=curr_month,"Current", IF(AND(cell_month>=EDATE(curr_month,-12),cell_month<=EDATE(curr_month,-1)),"Both", IF(cell_month=EDATE(curr_month,-13),"Previous","NA") ) ) )
为什么这个方案能解决误差问题?
EDATE(curr, -12):直接返回curr往前推12个月的日期(比如2018-05-01推12个月就是2017-05-01),完全不用考虑天数差异。EDATE(curr, -13):往前推13个月,正好是2017-04-01,对应你例子里的Previous标记。AND(cell_month>=EDATE(curr,-12),cell_month<=EDATE(curr,-1)):精准覆盖2017-05到2018-04的所有月份,不会因为天数计算出错。
验证结果
用你的例子测试:
2018-05对应的日期是2018-05-01,等于curr→ 标记Current2017-05到2018-04的日期落在2017-05-01到2018-04-01之间 → 标记Both2017-04对应的日期是2017-04-01,等于EDATE(curr,-13)→ 标记Previous- 更早的
2017-01到2017-03→ 标记NA
完全符合你的需求!
内容的提问来源于stack exchange,提问作者uchiha.itachi
相关产品推荐
相关产品推荐

