【问题标题】:Count paydays left in year计算一年中剩余的发薪日
【发布时间】:2012-08-05 01:17:57
【问题描述】:

我要数天数

  1. 从现在到年底(即 12 月 31 日)之间发生,并且
  2. 当月 15 日或最后一天(4 月、6 月、9 月、11 月 30 日;1 月、3 月、5 月、7 月、8 月、10 月、12 月 31 日;2 月 28 日)。

有没有办法做到这一点?

【问题讨论】:

  • 如果一个月有 31 天,您还希望包含该月的第 30 天吗?另外,二月份怎么样?
  • 你可以使用 VBA 还是只使用函数?
  • 是的,包括 12 月 31 日。我想使用纯 Excel 函数。

标签: excel excel-formula worksheet-function


【解决方案1】:

这似乎可行(尽管我认为它可能会被整理,我确信有更好的方法......)

=(12-MONTH(TODAY()))*2 
+ IF(DAY(TODAY())<15,2,
        IF(DAY(TODAY())<DAY(DATE(YEAR(TODAY()),MONTH(TODAY())+1,1)-1),1,0))

(12-MONTH(TODAY()))*2 : 剩余的每个完整月份两天

如果在 15 日之前加 2 天

如果是 15 日或之后而不是当月的最后一天,则加 1 天

【讨论】:

  • + 1 不错,适合所有月末。应返回 10。 :)
  • 它就像一场梦。我将小于更改为小于或等于(您的代码示例的最后一行),因此我可以考虑当天是 15 日。
【解决方案2】:

避免使用数组公式的变体。

1. For your question as asked

=SUMPRODUCT(--(DAY(DATE(YEAR(NOW()),MONTH(NOW()),DAY(NOW()))+ROW(INDIRECT("1:"&amp;DATE(YEAR(NOW()),12,31)-TODAY()+1)))={15}))+(13-MONTH(TODAY()))
= 10

2. For my initial interpretation which was to count any days corresponding to a certain day of the month

=SUMPRODUCT(--(DAY(DATE(YEAR(NOW()),MONTH(NOW()),DAY(NOW()))+ROW(INDIRECT("1:"&amp;DATE(YEAR(NOW()),12,31)-TODAY()+1)))={15,30}))
=10

=SUMPRODUCT(--(DAY(DATE(YEAR(NOW()),MONTH(NOW()),DAY(NOW()))+ROW(INDIRECT("1:"&amp;DATE(YEAR(NOW()),12,31)-TODAY()+1)))={15,31}))
=8

=SUMPRODUCT(--(DAY(DATE(YEAR(NOW()),MONTH(NOW()),DAY(NOW()))+ROW(INDIRECT("1:"&amp;DATE(YEAR(NOW()),12,31)-TODAY()+1)))={15,30,31}))
=13

要更改所需的天数,只需更改 {15,30} 组件 IE ={1,2,12,15,31} 计算所有落在 1 日、2 日、12 日、15 日和 31 日等的日子

这个公式将处理闰年

【讨论】:

  • + 1 很好地使用了SUMPRODUCT。该公式应返回 8。
  • brettdj。它对 {15,30,31} 给出了意想不到的结果。它应该返回 10 还是我错过了什么?
  • @SiddharthRout 它应该是 13 - 它是 :) (从 8 月到 12 月的所有月份至少有 30 天,所以 8(来自上一个问题)+5 = 13)
  • 哈哈哈……现在还是早上 6:39 :D
  • 公式中的-- 是什么意思?
【解决方案3】:

这应该适用于任何版本的 Excel 中任何一年的任何一天,直到 2078 年(在 Excel 2007 或更高版本中更长)。

=SUM(IF(DAY(ROW(OFFSET($A$1,TODAY(),0,DATE(YEAR(TODAY()),12,31)-TODAY()+1)))={1,16},1,0))

请注意,我在 1 天的偏移量上检查第 1 天或第 16 天(这个想法是为了解决不同的月末 DAY() 值)。

{数组公式...按Ctrl+Shift+Enter提交}

[附录]

如果您不想包含当天(例如,假设今天是 8 月 15 日),请改用:

=SUM(IF(DAY(ROW(OFFSET($A$1,TODAY()+1,0,DATE(YEAR(TODAY()),12,31)-TODAY()+1)))={1,16},1,0))

附:从今天到 2016 年闰日及以后的所有日期,我都进行了测试,效果很好。所有这些都是测试被DAY() 函数视为日期序列的行号,以查看它们是 1 还是 16,但序列被 +1 偏移,所以它真的在检查 DAY() 是否是 [最后一天无论月份] 或 15。如果结果为真,则加 1,否则加 0。


[更多附录]

以下是 非数组 版本,否则它们的工作方式相同:

包括当天:

=SUMPRODUCT(N(DAY(ROW(OFFSET($A$1,TODAY(),0,DATE(YEAR(TODAY()),12,31)-TODAY()+1)))={1,16}))

不包括当天

=SUMPRODUCT(N(DAY(ROW(OFFSET($A$1,TODAY(),0,DATE(YEAR(TODAY()),12,31)-TODAY()+1)))={1,16}))

【讨论】:

    猜你喜欢
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多