【问题标题】:Return the last date from a range返回范围中的最后一个日期
【发布时间】:2015-11-13 16:41:06
【问题描述】:

我有一张表,我需要获取每年每个月的最后一天。我的表有从 2007 年到 2015 年的日期和月份,而月份中的天数并不总是相同。

我正在寻找一个公式,该公式将在我的范围内查找,并返回每个月的最后一天,具体取决于年份。 (我的数据不是每天都有数据,所以日历上的最后一天不一定是我数据中的最后一天)。

这是我的日期信息(列 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 1 变为8 2015 31。

我可以使用什么样的公式来返回每个月、每年的最后日期?

我尝试过使用 Max 的公式,但无法完全理解。不幸的是,没有 MaxIf() 函数,理论上可以工作。这是我修改过的东西,

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

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

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

因此,我不能单独使用date 或EODate() 或edate。我也知道有一种方法可以使用date 并设置假期,并且只使用工作日。这也不太可能完全奏效,因为我不知道要添加哪些假期。

编辑 3:临时解决方案: 同时,我所做的是在月/年/日列表中删除,并删除了所有行除了最后一个日期。所以在我的上表中,我删除了直到12 2009 31 的行,然后删除了直到1 2010 31 的下一行,等等。然后我基于此创建了一个table,并使用Vlookup 来获取最后一天。 (Here's a screenshot)。这很笨拙,但有效。不过,我仍然对公式答案非常感兴趣,我可以用 VBA 做到这一点我只是很惊讶它这么复杂:O

【问题讨论】:

  • 如果您有 Excel 2003,EOMONTH 公式将需要添加分析工具包,替代方法是 =DATE(B1,A1+1,0)(下个月的第 0 天)。

标签: excel-formula


【解决方案1】:

只需使用EOMONTH:

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

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

末尾的“0”表示给定日期的当前月份,“1”表示下个月的月底。 '-1' 表示上个月结束。

正如 Darren 所指出的,这仅适用于 2003 年后的 excel。

编辑:

所以如果一个月的最后一天是周末,这个公式将在星期五之前得到。

=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。

编辑2:

我找到了一个有效的数组公式:

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

我不敢指出这一点:

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

【讨论】:

  • 感谢编辑!是否一直使用date()?我想假装日期只是数字,并将它们视为数字 - 所以我只是在寻找由年份和月份确定的范围内的最大数字。
  • @BruceWayne 这在 vba 中会容易得多。但是我知道你要去哪里,你已经在列表中列出了当月的最后一个工作日你只需要知道如何挖掘它,让我考虑一下。
  • 我找到了一个临时解决方案,但有点惊讶它需要 VBA。我将用我的临时解决方案更新我的 OP。很抱歉关于日期的混乱,我希望现在更清楚了!
  • 嘭!最大/如果有效!我不知道为什么我以前没有想到这一点。在我的脑海中,这是一个简单的“maxif”……我会把它归结为星期五。非常感谢斯科特!
  • @BruceWayne,“Maxif”正是我在谷歌上搜索的内容,发现可以针对您的具体问题进行修改。
【解决方案2】:

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

=DATE(B1, A1 + 1, 0)

基本上,Excel 允许您指定月份的“第零”天来表示该月第一天的前一天

【讨论】:

  • 根据 OP,月、年、日被分成不同的列,您的公式应该类似于 Darren 的
【解决方案3】:

你可以这样做:

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

这基本上将其转换为日期,添加一个月,并减去该月的天数,因此它是上个月的月底。

或者正如@Scott Craner 指出的那样,EOMONTH(DATE(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(range, date)>1 的内容,然后回溯到本身不是假期的工作日(例如,在星期二回溯 12 月 25 日一直回到 12 月 21 日星期五)。如果是这种情况,您最好使用自定义函数而不是疯狂的单行公式。

【讨论】:

  • 嗯 - 这很有趣!我会检查一下,巧妙地使用e/Date()。
  • 再次感谢@ScottCraner。抱歉,我不清楚 - 我编辑了 OP。我的工作表的最后一天不一定是日历的最后一天(我使用的是交易日,即周末和随机假期)。因此,公式需要能够搜索我确实有哪些日子。那有意义吗?这比我想象的难吗?
【解决方案4】:

我不知道是否有办法在没有假期列表的情况下做到这一点,但如果您能够创建要排除的假期列表,则可以使用:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2017-02-13
    • 2020-04-14
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多