微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Excel - 计算两个日期之间每个月的天数两个日期都可用

如何解决Excel - 计算两个日期之间每个月的天数两个日期都可用

我发现解决方案认为分享会很好:

所以公式应该是: =((MAX(CT$6-$N8,0)-MAX(EOMONTH(CT$6,-1)-$N8,0))-(MAX(CT$6-$O8,0)-MAX(EOMONTH(CT$6),-1)-$O8,0))+(EOMONTH(CT$6,0)=EOMONTH($N8,0)))*1

:)

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

enter image description here

我尝试使用来自同一网站的 if 和 sum product 公式,但由于某种原因,它无法识别上个月的天数。想知道是否有人可以帮助解释这个公式的作用以及如何纠正它。

=IFERROR(IF(AND(CS$6>=$M9,CS$6

解决方法

一种可能的解决方案是使用 MIN 和 MAX 函数来比较日期,如下所示:

=IF(MIN($B2+1,D$1)-MAX($A2,C$1)<0,"",MIN($B2+1,C$1))

screenshot

此解决方案使用月份开始日期(例如 2021 年 2 月 1 日),但可以改为使用月份结束日期(例如 2021 年 2 月 28 日)。

这个想法是,您取完成日期或月结束日期中的较晚者减去开始日期或月份开始日期中的较小者。对于第一个月和最后几个月,这将返回该范围内的天数,包括第一天和最后一天。对于第一个月和最后一个月之间的所有月份,它返回该月的天数。

最小结束日期的 +1 似乎有点违反直觉,但有必要在计数中包括第一天和最后一天。如果没有它,您将在 2022 年 3 月获得 14 天而不是 15 天。

“如果小于零”函数使其在 dat 范围之外的任何月份返回一个空白(或零,如果您愿意)。

此解决方案未按月汇总(例如,2021 年 2 月为 19 天,2022 年为 28 天,2 月总共为 47 天),但这与您提供的示例一致。评论还表明您还想考虑年份。

,

第二次修订 (R2)

  • 更新了工作簿链接以捕获固定的列标题
  • Eqn/公式还包括静态视图

根据跨年的不同,R2 代表不太有利的结果重新空间(将需要更多的列)。在这种情况下,匹配堆叠视图所需的附加列数 ~100 (!!)。

第一次修订 (R1) 等 基于@Charlotte.Sarah.Smith 的反馈

  • 每个月的天数比应有的天数少 1 天 - 这一点已经 更正(在屏幕截图、链接表和相关方程中)
  • 还展示几个可能/不感兴趣的示例插图/视觉表现(也包含在链接表中)

假设我们想通过将日期按堆叠来扩展@Will的解决方案,这样列标题可以根据不同的开始日期而变化(而不是非常碰巧出现的第一个开始日期)...

例如,如果下一行包括“开始 = 10/02/16”到“结束 = 15/03/19”的日期范围 - 您会意识到跨越 1 月至 12 月的列数('16 ),Jan-Dec ('17),...直到(包括)第一行中的范围(Jan '21 - Mar '23)变得笨拙。


通过使用数据表(请参阅here),您可以生成每月天数的“堆叠”视图,而不考虑年份 (!) - 请参见下面的屏幕截图和链接到 this [更新/更正] 工作表。

R1,stacked days by month chart

R2 屏幕截图:

R2 - Update


修订

见末尾的验证/对帐栏

*视觉表示 - 可用于评估趋势等。

2D and 3D illustrations


3D 也很有趣!

enter image description here

1] 红色字体:定义数据表结构的第一行:以“10/02/2021-15/08/2023”格式输入日期范围

单元格 E3 eqn(向右拖动):

=IFERROR(IF($A3>EDATE(E$2,1),MAX(,IFERROR(IF(MIN($B3,MIN(EDATE(E$2,$B3))=E$2-1,MIN($B3,$B3))),"")-MAX($A3,E$2))),0)

(类似于我们之前看到的)

2] 红色字体下方的表格:根据需要/要求在 A、B 列中输入任何开始日期(作为常规日期,例如 dd/mm/yyyy)


数据表

3] 数据表(列数据):在单元格 c4 中输入以下内容(按要求向下拖动)

=TEXT(A4,"dd/mm/yyyy")&"-"&TEXT(B4,"dd/mm/yyyy")

4] 数据表(突出显示单元格 c3:d42,插入数据表,为“行输入”选择空白/空单元格,为“列输入”选择 c2)

否则数据表应该“活跃起来”(计算工作表,Shift + F9)。

FilterXML

5] 用分隔符“|”分割结果使用 FilterXML 如下(单元格 E4,只能向下拖动,而不是向右):

=IFERROR(TRANSPOSE(FILTERXML("<AllText><Num>"&SUBSTITUTE(LEFT(MID(D4,2,LEN(D4)-1),LEN(MID(D4,LEN(D4)-1))-1),"|","</Num><Num>")&"</Num></AllText>","//Num")),"")

验证

注意检查列:日期差异 = 表格中的天数总和(默认单元格颜色否则为红色):

Check column included as part of revised / corrected solution - all in order ☺

修订版 2

这是上面的静态版本的公式(即没有按年份堆叠,而是列标题中的每个日期都是不同的重新计算)-它已经可以在行中使用红色字体(!!)

=IFERROR(IF($A3>EDATE(C$2,MIN(EDATE(C$2,$B3))=C$2-1,C$2))),0)

中提琴!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。