【问题标题】:Excel - count days in each month between two datesExcel - 计算两个日期之间每个月的天数
【发布时间】:2017-06-12 12:10:40
【问题描述】:

我正在尝试编写一个 Excel 公式,该公式可以拖过一行单元格,以给出两个指定日期之间每个月的天数。例如:

         A           B         C       D       E       F 

1  | START DATE | END DATE |  Jan  |  Feb  |  Mar  |  Apr  |...
   ---------------------------------------------------------
2  |  10/02/17  | 15/03/17 |   0   |  19   |  15   |   0   |...

另一个复杂的问题是结束日期可能会留空,表示结束日期应视为今天。我可以在从 C2 开始的单元格中输入公式,但必须保留 A 列和 B 列供用户输入。

我使用大量嵌套的 if 语句取得了一些进展,但如果结束日期为空白,我很难处理它。

有人可以帮忙吗?

*编辑

到目前为止,我没有展示我写的公式,因为我担心它有点乱,但按照要求,我现在在下面显示(这个公式来自 C2)

 =IF(AND($A2<C$1,$B2<D$1),DAY(A2),IF($A2>=D$1,0,IF(AND($A2<C$1,$B2=""),IF(TODAY()<C$1,0,IF(TODAY()>C$1,IF(TODAY()<D$1,DAY(TODAY()),D$1-C$1),IF(TODAY()<D$1,INT(TODAY()-$A2),$D1-$C1))),IF(AND($A2>=C$1,$B2=""),IF(TODAY()<D$1,INT(TODAY()-$A2+1),D$1-$A2),IF(AND($A2>=C$1,$B2<D$1),$B2-$A2+1,IF(AND($A2<C$1,$B2<C$1),0,IF(AND($A2>=C$1,$B2>=D$1),D$1-$A2,IF(AND($A2<C$1,$B2<D$1),DAY(B2),IF(AND($A2<C$1,$B2>=D$1),D$1-C$1,0)))))))))

【问题讨论】:

  • 如果第一天很重要,您的示例应该有 19
  • 感谢您的评论。是的,第一天应该算,我已经编辑了我的问题
  • 我们也可以假设开始日期不超过结束日期前一年吗?
  • 那么看看你到目前为止的公式会很有用;但只是猜测,用IF(ISBLANK([End Date], TODAY(), [End Date]) 替换公式中出现的[End Date] 应该处理空白。或者,如果[End Date] 是一些复杂函数而不是单元格引用(如上面的 IF 语句)是1/IFERROR(1/[End Date], 1/TODAY()),我喜欢使用的公式是1/IFERROR(1/[End Date], 1/TODAY()),因为它只使用[End Date] 一次,而不是在另一个公式中使用两次(但是可以说它的可读性较差)。发布您编写的代码总是比试图让用户为您编写代码更好
  • 我真的认为它会,这个网站上有很多聪明人可以阅读几乎任何公式,试试吧!但尽量限制您发布的内容,仅显示相关内容(请参阅the help centre)。使用多个嵌套 if 语句时也考虑 IFS( (office 365 2016),或者如果 IFS 不是一个选项,则考虑 CHOOSE(

标签: excel excel-formula


【解决方案1】:

无论如何,这里是基于标准公式的完整性替代方法

=max(0,min(end1,end2)-max(start1,start2)+1)

对于两个日期范围之间的重叠

=MAX(0,MIN(IF($B2="",TODAY(),$B2),EOMONTH(DATEVALUE(C$1&"-17"),0))-MAX($A2,DATEVALUE(C$1&"-17"))+1)

【讨论】:

  • 太棒了,我早些时候尝试过,但因为找不到EOMONTH而感到疲倦。
  • 谢谢,我最初的努力是在下个月而不是最后一天,但我意识到到了 12 月这会失败......
  • 大声笑,正是让我放弃的原因。以前从未听说过EOMONTH。很好,你终于找到了:)顺便说一句,我认为这是正确的方法,因为它避免了大型数组计算。
  • 太好了,谢谢。高效而简单!我也没有听说过 EOMONTH,但很高兴知道
【解决方案2】:

使用 SUMPRODUCT:

=SUMPRODUCT(--(TEXT(ROW(INDIRECT($A2 & ":" & IF($B2="",TODAY(),B2))),"mmm")=C$1))

这将遍历日期并将三个字母月份的文本与标题匹配。

这假定标题是文本而不是格式为 mmm 的日期。

ROW(INDIRECT($A2 &amp; ":" &amp; $B2)) 与我们可以通过公式获得的 For 循环非常接近。它将一次迭代 1 天。因为日期在 Excel 中存储为数字,其中一天为1,我们可以从开始日期迭代到结束日期。

SUMPRODUCT 是一个数组类型的公式,它是导致公式循环并进行计数的原因。

(TEXT(ROW(INDIRECT($A2 &amp; ":" &amp; IF($B2="",TODAY(),B2))),"mmm")=C$1) 为每次迭代返回 TRUE/FALSE,而 -- 将其转换为 1/0。

SUMPRODUCT 然后将所有的 1/0 相加得到计数。


如果标题是格式为mmm 的日期,则改用它:

=SUMPRODUCT(--(MONTH(ROW(INDIRECT($A2 & ":" & IF($B2="",TODAY(),B2))))=MONTH(C$1)))

【讨论】:

  • 这很好用,谢谢。我以前从未使用过 sumproduct,我会熟悉它的工作原理。这比我尝试做的要简单得多。谢谢
  • 超级答案 - 但要解决 B 列值为空的极端情况,您可以将公式修改为:=SUMPRODUCT(--(TEXT(ROW(INDIRECT($A4 &amp; ":" &amp; IF($B4="",DATE(YEAR(NOW()),MONTH(NOW()),DAY(NOW())),$B4))),"mmm")=E$1)) 只需将答案中的 $B2 替换为 IF($B4="",DATE(YEAR(NOW()),MONTH(NOW()),DAY(NOW())),$B4)))
  • @RobinMackenzie 或将整个包裹在 IFERROR(SUMPRODUCT(--(TEXT(ROW(INDIRECT($A2 &amp; ":" &amp; $B2)),"mmm")=C$1)),"")
  • @ScottCraner - 当我尝试它时留下空白。我认为 OP 正在寻找 if B = empty then B = NOW() 逻辑。
  • 错过了那部分,但可以缩短为IF($B2="",TODAY(),B2)
猜你喜欢
  • 1970-01-01
  • 2019-04-12
  • 2012-10-28
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
相关资源
最近更新 更多