eomonth返回某个月份最后一天的日期

你好,我是刘卓。欢迎来到我的公号,excel函数解析。今天要和你分享的函数是eomonth,它是返回指定月数之前或之后的月份的最后一天。简单来说就是返回某个月的最后一天,而这个月是由起始日期往前或往后推几个月得到的。下面来看一下它的有关用法帮助。
-01-
函数说明
eomonth返回某个月份最后一天的日期,该月份与起始日期相隔n个月。n可以是正数,0,负数。它有2个参数,语法结构如下:
EOMONTH(start_date, months)

第1参数Start_date:表示起始日期,可以是数字,或者是能转化成日期的文本和函数等。比如4392,"2020-1-18"。
第2参数Months  :表示起始日期往前或往后推的月数,如果是正数,则往后推,得到的是未来的日期;如果是负数,则往前推,得到的是过去的日期。如果是0,就是现在的日期。
注意,如果第2参数months是小数,将截尾取整。另外,eomonth的第1参数可以支持数组,但不支持区域引用。所以想要用数组的方式,可以把区域引用变成数组。
-02-
示例解释
看完它的参数说明,你可能还是一头雾水。下面通过几个简单的示例说明一下它的运算方法。如下图所示,A列是起始日期,也就是第1参数;B列是要往前或往后推的月数,也就是第2参数。C列是返回的结果。
先看第1个,起始日期是2020/3/20,要推的月数是-2,负数就是往前推,2020年3月往前推2个月,就是2020年1月,然后返回2020年1月的最后一天,也就是2020/1/31。
第2个,起始日期是2020/12/7,要推的月数是-1,就是2020年12月往前推1个月,得到2020年11月,最后返回2020年11月的最后一天,2020/11/30。
第3个,2020/4/8,推0个月,还是2020年4月,返回4月的最后一天2020/4/30。
第4个,2020/1/31,往后推1个月,就是2020年2月,返回2月的最后一天2020/2/29。
第5个,给你个学习的机会,你自己算吧。
-03-
具体应用

1.计算当月的天数
如下图所示,给出一些日期,求出日期所在的当月有多少天。比如2002/6/17所在的月份是6月,那么就要算出2002年6月有多少天。其实这个题目之前我们就做过了。今天用eomonth做一下。在B10单元格输入公式=DAY(EOMONTH(A10,0)),向下填充完成。
第1步先用eomonth算出当月最后一天的日期,第2步再用day取出它的天数就可以了。这里要注意的是当eomonth的第2参数为0时,不可以省略不写。
2.计算当月月初的日期
求月初的日期,比如2002/6/17的月初日期是2002/6/1。思路是用上个月的最后一天加1。2002/6/17的上个月最后一天是2002/5/31,加1就是2002/6/1。所以第1步用eomonth往前推1个月,求出上个月最后1天的日期;第2步加1就可以了。完整的公式为=EOMONTH(A18,-1)+1。
3.时间区间内按月汇总销量
下面来个综合性比较强的例子。下图左表是2018/1/1到2020/4/1的销售数据,大概有50多行,这里只能截图一部分。想要实现的效果如右表动图所示。设置一个起始日期和结束日期,然后自动统计出这个时间范围内每个月的总销量。这里要说明的是起始年月和结束年月的格式都是文本,不过excel可以识别到这样的日期。
下面说一下它是怎么做到的,首先我们要根据起始年月和结束年月把这个时间范围内每个月都列出来,如E列所示。然后再根据E列的年月对每个月份的销量汇总求和。
E列的公式为=TEXT(EOMONTH(F$25,ROW(A1)-2)+1,"[<="&--F$26&"]e年m月;")。现在看不懂也没有关系。我们发现E列的年月很有规律,从起始年月开始,向下累加1个月,一直到结束年月。其实我们可以把E列的年月看作每个月的第1天,比如2018年10月,就看作2018/10/1。只要算出月初的日期,就可以用text提取出年月。

那么下面的目标就是如何得到月初的日期,如下图所示。我们从第2个题目知道月初的日期等于上个月的最后一天加1。所以E28单元格的日期就是F25的起始年月往前推一个月的最后一天加1。公式为=EOMONTH(F$25,ROW(A1)-2)+1。这里用了row(a1)是因为要推的月份是动态变化的。比如到了E29要推的月份就不是-1了,而是0。

这里还有一个问题就是,当随着公式的下拉,月初的日期会超过结束的日期。如上图红线分割所示。怎么样让2019年5月以后的日期不显示呢?就要用到判断了。当月初的日期大于结束的日期时显示为空,否则显示为年月的方式。我这里用text判断,就是上面那个公式,这样就把大于结束年月的日期显示为空了。如果你不懂text,也可以用if判断。
第1个问题完成了,下面就是求每个月的总销量了。方法有2种,第1种用sumifs来完成,在F28单元格输入公式=IF(E28="","",SUMIFS(C$26:C$76,A$26:A$76,">="&E28,A$26:A$76,"<="&EOMONTH(E28,0))),向下填充。
这种方法是判断A列的日期大于等于月初且小于等于月末,如果符合就对C列的销量求和。
第2种方法就是eomonth第1参数的数组用法,在F28单元格输入公式=IF(E28="","",SUMPRODUCT((EOMONTH(E28,0)=EOMONTH(--A$26:A$76,0))*C$26:C$76)),向下填充。eomonth第1参数要用数组,必须把区域转为数组,这里是通过负负运算转换的。
就是判断A列的日期是否是2018年10月中的日期,如果是就乘以C列的数量,最后求总和。这里的关键就是如何判断A列的日期是2018年10月中的日期。这里涉及到2个条件,既有年又有月,其实我们可以用eomonth转到当月的最后一天,然后比较是否相等。因为同年同月的转到最后一天肯定是相等的。比如2018/10/10转为最后一天是2018/10/31,2018/10/1转为最后一天还是2018/10/31。
当然除了用eomonth判断同年同月,还可以用text提取年月判断,比如=text(e28,"e-m")。
链接:
https://pan.baidu.com/s/17Wjuc5AeV2pb8rccZBcuzQ
提取码:t7s3
(0)

相关推荐