【问题标题】:Excel Formula to calculate yearly overlap percentage columns from two date columnsExcel 公式从两个日期列计算年度重叠百分比列
【发布时间】:2020-07-13 20:51:11
【问题描述】:

我有 2 列 Start Date 和 End Date?,我想根据它们跨越的相关年份计算这些日期的百分比,以便在各自的单独列中为每年分配适当的百分比。

我的预期输出是:

  Start      End Date?    Year 1 - 2020    Year 2 - 2021    Year 3 - 2022
1/1/2020    12/30/2022         100%             100%             100%
1/1/2020    6/30/2021          100%             50%               0%  
6/1/2021                        0%              50%              100%
6/1/2021    6/30/2022           0%              50%              50%
1/1/2021    6/30/2021           0%              50%               0% 
                               100%             100%             100%  

这假设如果开始日期为空白,则该项目是连续的,并且应该是所有年份的 100%,如果有一个为空白的结束日期,则该项目将在该年之后的每年 100%开始。开始日期为空白时,结束日期始终为空白。

目前我正在使用一个非常长的 IFS 公式,分别比较开始日期 Column A 和结束日期 Column B 与每年 Column AP 和 Column AQ 的开始日期和结束日期

=IFS(OR(ISBLANK($B8),$B8=AP$1,AND($B8<AP$1,$C8>=AQ$1),AND($B8<AP$1,ISBLANK($C8))),100%,OR($C8<AP$1,$B8>AQ$1),0%,OR(AND($B8>AP$1,$C8>AQ$1),AND($B8>AP$1,$C8<AQ$1),AND($B8>AP$1,ISBLANK($C8)),AND($B8<AP$1,$C8<AQ$1)),(IF($B8<AP$1,DATEDIF(AP$1,$C8,"d")/DATEDIF(AP$1,AQ$1,"d"),DATEDIF($B8,$C8,"d")/DATEDIF(AP$1,AQ$1,"d"))))

我构建这个庞大的 IFS 公式的方法是认为每年有三个结果:100%、0% 或介于两者之间的百分比。前两个 sub-if 似乎可以很好地捕获 100% 的
OR(ISBLANK($B18),$B18=AP$1,AND($B18&lt;AP$1,$C18&gt;=AQ$1),AND($B18&lt;AP$1,ISBLANK($C18))),100%

或0%的

OR($C18&lt;AP$1,$B18&gt;AQ$1),0%

但是我为捕捉中间百分比而构建的公式部分似乎并没有捕捉到所有情况,例如,如果有空白......

OR(AND($B23&gt;AP$1,$C23&gt;AQ$1),AND($B23&gt;AP$1,$C23&lt;AQ$1),AND($B23&gt;AP$1,ISBLANK($C23)),AND($B23&lt;AP$1,$C23&lt;AQ$1)),(IF($B23&lt;AP$1,DATEDIF(AP$1,$C23,"d")/DATEDIF(AP$1,AQ$1,"d"),DATEDIF($B23,$C23,"d")/DATEDIF(AP$1,AQ$1,"d"))))

我也觉得好像必须有某种方法可以在没有令人作呕的长 IFS 公式的情况下做到这一点......

【问题讨论】:

  • 您愿意探索 Excel VBA 吗?它比使用“令人作呕的长”公式更易于维护。 :-)

标签: excel excel-formula


【解决方案1】:

实际上,所需的公式并不像第一眼看到的那么糟糕。它可以通过简单的步骤构建,非常合乎逻辑,并且易于维护。这里是。 (067)

=IFERROR(IF($A2="",1,IF($A2>=EDATE(F$1,12),0,IF(OR($B2="",$B2>=EDATE(F$1,12)),1,IF(DATEDIF(F$1,$B2,"m")>=12,1,DATEDIF(F$1,$B2,"m")/12)))),0)

Key 是 F$1 的内容。它必须是一年的第一天。您可以将其格式化为yyyy,但除非您想做一些相当花哨的步法,否则您不能使用“Year 1 - 2020”。我在 F1 中输入 1/1/2020,[G1]=EDATE(F1,12) 并将该公式复制到右侧。

我在 A2 中有一个开始日期,在 B2 中有一个结束日期。结果以百分比形式返回,即 1 = 100%。

  1. IF($A2="",1如果没有开始日期收费100%。
  2. IF($A2&gt;=EDATE(F$1,12),0 如果开始日期在 F1 中的年末之后。事实上,EDATE(F$1,12) 正是 G1 中的日期,但我不想参考另一列。
  3. IF(OR($B2="",$B2&gt;=EDATE(F$1,12)),1如果没有结束日期或结束日期大于G1,收取100%
  4. IF(DATEDIF(F$1,$B2,"m")&gt;=12,1 如果从 F1 到 B2 的时间超过一年,也会收取 100% 的费用。这是一个疏忽。条件可以包含在前面的 OR() 中。
  5. 除去所有其他条件后,剩余部分是一年的一小部分,因此计算得出,DATEDIF(F$1,$B2,"m")/12。 DateDif 函数以任何方式对月份进行舍入。如果您想要更精确的结果,可以使用“d”并除以 365.25。
  6. 如果结束日期(此函数的 F1)早于开始日期 (B2),则 DateDif 函数中会出现 #NUM 错误。我没有设法在部门中捕捉到这个错误。因此,我将整个函数包装在 IFERROR() 中。

【讨论】:

  • 谢谢 - 这是一个更易于管理的 IF 公式 - 但是它似乎是计算错误的项目,其中开始日期在一年中并且有一个空白的结束日期。例如;对于像我的预期输出表的第三行这样的东西,它将第 2 年计算为 100%,它应该显示为 50%。我相信这是你公式的这一部分 IF(OR($C42="",$C42&gt;=EDATE(AP$1,12)),1 所以会采取措施并更新如果我找到解决方案!
  • 我想我明白了!如果开始日期发生在一年内,我更新了您的 IFERROR 以计算百分比,还将您的 DATEDIF 计算中的月份更改为天。最终公式:=IFERROR(IF($B6="",1,IF($B6&gt;=EDATE(AP$1,12),0,IF(OR( AND($B6&lt;AP$1,$C6=""),$C6&gt;=EDATE(AP$1,12)),1,IF(DATEDIF(AP$1,$C6,"d")&gt;=365,1,DATEDIF(AP$1,$C6,"d")/365)))),IF($B6&lt;AP$1, IFERROR(DATEDIF(AP$1,$C6,"d")/365,0),DATEDIF($B6,AQ$1,"d")/365))
  • ^ 供参考; B栏是我的开始日期,C栏是我的结束日期。 AP 列是相关年份的第一天,AQ 是相关年份的最后一天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2017-01-01
  • 2021-12-17
  • 2023-02-01
相关资源
最近更新 更多