返回范围

时间:2015-11-13 16:41:06

标签: excel-formula

我有一张桌子,我需要每个月的最后一天,每年。我的表格包含了从2007年到2015年的日期和月份,而且这些月份的日期并不总是相同。

我正在寻找一个符合我的范围的公式,并根据年份返回每个月的最后一天。 (我的数据每天都没有数据,因此日历中的最后一天可能不一定是我数据中的最后一天。)

这是我的日期信息(cols A,B和C)的一个(非常)简短的例子:

12  2009    24
12  2009    28
12  2009    29
12  2009    30
12  2009    31
1   2010    4
1   2010    5
1   2010    6
1   2010    7
1   2010    8
1   2010    11
1   2010    12
1   2010    13

所以它是月,年,日,从1 2007 18 2015 31

我可以使用哪种公式来返回每年每月的最后日期?

我已经尝试过Max的公式,但是不太明白。不幸的是,没有MaxIf()功能,理论上可行。这是我修补过的东西,

=INDEX(MAX(Day),MATCH(C22&MONTH(DATEVALUE($B23&" 1")),Year&Months,0))c22为“2007”,B23为“1月”

编辑:Here's a screenshot如果它更容易一点。我试图每年每个月的最后一天返回“犯罪”号码。

编辑2:对不起,如果我不清楚 - 的日期必须遵循日历。数据来自基本的股票交易,在周末和一些随机日期不开放。因此,我需要使用文档中的日期来确定最后一天,我不能仅仅使用每个月的真实最后一天(根据日历)。

因此,我不能仅使用dateEODate()edate。我也知道有一种方法可以使用date并设置假期,并且只使用工作日。这也不太可能完全正常,因为我不知道要添加什么假期。

编辑3:临时解决方案: 与此同时,我所做的是在月/年/日的列表中删除,并删除了除最后日期之外的所有行。所以在上面的表格中,我删除了行12 2009 31,然后删除了1 2010 31之前的行等等。然后我根据此创建了table,并使用了Vlookup得到最后一天(Here's a screenshot)。这很愚蠢,但很有效。我仍然对一个公式答案非常感兴趣,我可以用VBA做到这一点我很惊讶它是这个复杂的:O

4 个答案:

答案 0 :(得分:2)

只需使用EOMONTH

=EOMONTH(DATE(B1,A1,C1),0) 

它找到任何给定日期的月末。

' 0'最后是指给定日期的当前月份,' 1'会在下个月结束。 ' -1'会给上个月末。

正如达伦所指出的那样,这只适用于2003年以后的擅长。

编辑:

因此,如果每个月的最后一天都在周末登陆,那么这个公式将在周五之前得到。

=IF(WEEKDAY(EOMONTH(DATE(B1,A1,C1),0))=1,EOMONTH(DATE(B1,A1,C1),0)-2,IF(WEEKDAY(EOMONTH(DATE(B1,A1,C1),0))=7,EOMONTH(DATE(B1,A1,C1),0)-1,EOMONTH(DATE(B1,A1,C1),0)))

我仍然在考虑假期,虽然只有少数人在本月的最后一天做或可能降落。我只是在想,但你可以在那些日期做一个vlookup并手动输入一个因子来减去日期。因为问题是假期在星期一或星期日降落,那么你会减去3,星期六2和所有其他日子1。

EDIT2:

我找到了一个可行的数组公式:

=MAX(IF($B$1:$B$13 & $A$1:$A$13 = B1 & A1,$C$1:$C$13))

我畏缩地指出这一点:

1)更改范围以匹配您的数据。 2)这是一个数组公式,所以ctrl-shift-enter来应用。

答案 1 :(得分:0)

您可以这样做:

=EDATE(DATE(B1,A1,C1),1)-DAY(EDATE(DATE(B1,A1,C1), 1))

基本上将其转换为日期,为其添加一个月,并减去该月的日期,以便它在上个月结束。

或者@Scott Craner指出,EOMONTH(日期(B1,A1,C1),0)完全相同。

如果您正在寻找上一个工作日,可以试试这个:

=IF(WEEKDAY(DATE(B14,A14+1,0))=1,DATE(B14,A14+1,0)-2,IF(WEEKDAY(DATE(B14,A14+1,0))=7,DATE(B14,A14+1,0)-1,DATE(B14,A14+1,0)))

检查它是星期天还是星期六,然后回过头一两天。

如果您有特定假期的列表,则必须添加类似于countif(范围,日期)> 1的内容,然后回溯到工作日本身不是假日(例如,回溯12月25日)星期二一直回到12月21日周五)。如果是这种情况,你最好使用自定义函数而不是疯狂的单行公式。

答案 2 :(得分:0)

如果您在单元格A1中有月份而单元格B1中有年份,则该月份的最后一天的日期为:

=DATE(B1, A1 + 1, 0)

基本上,Excel允许您指定"零"每月的某一天表示该月第一天的前一天

答案 3 :(得分:0)

我不知道是否有办法在没有假期列表的情况下执行此操作但如果您能够创建要排除的假期列表,则可以使用:

=WORKDAY.INTL(EOMONTH(date(B1,A1,C1),0),0,1,E1:E5)

其中E1:E5是您要排除的假期。