Формула Excel для расчета годовых столбцов процента перекрытия из двух столбцов дат - PullRequest
1 голос
/ 13 июля 2020

У меня есть 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% или процентное соотношение между . Первые два под-if, похоже, отлично работают для захвата 100% OR(ISBLANK($B18),$B18=AP$1,AND($B18<AP$1,$C18>=AQ$1),AND($B18<AP$1,ISBLANK($C18))),100%

или 0%

OR($C18<AP$1,$B18>AQ$1),0%

, но часть формулы, которую я построил для захвата промежуточных процентов, похоже, не отражает всех ситуаций, например, если есть пробелы ...

OR(AND($B23>AP$1,$C23>AQ$1),AND($B23>AP$1,$C23<AQ$1),AND($B23>AP$1,ISBLANK($C23)),AND($B23<AP$1,$C23<AQ$1)),(IF($B23<AP$1,DATEDIF(AP$1,$C23,"d")/DATEDIF(AP$1,AQ$1,"d"),DATEDIF($B23,$C23,"d")/DATEDIF(AP$1,AQ$1,"d"))))

Я также чувствую, что должен быть какой-то способ сделать это без до тошноты длинной формулы IFS ...

1 Ответ

0 голосов
/ 13 июля 2020

На самом деле, требуемая формула не такое уж плохое чудовище, как может показаться на первый взгляд. Его можно построить в несколько простых шагов, что вполне логично, и это облегчает его обслуживание. Вот. (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)

Ключ - это содержимое F $ 1. Это должен быть первый день года. Вы можете отформатировать его как yyyy, но у вас не может быть «Year 1-2020», если вы не хотите делать довольно причудливую работу ног. Я ввел 01.01.2020 в F1, [G1] =EDATE(F1,12) и скопировал эту формулу вправо.

У меня была дата начала в A2 и дата окончания в B2. Результат возвращается в процентах, то есть 1 = 100%.

  1. IF($A2="",1 Если нет начального дня, начисляется 100%.
  2. IF($A2>=EDATE(F$1,12),0 Если начальная дата после конца года в F1. Фактически, EDATE (F $ 1,12) - это точно дата в G1, но я не хотел ссылаться на другой столбец.
  3. IF(OR($B2="",$B2>=EDATE(F$1,12)),1 Если нет даты окончания или дата окончания больше, чем G1, заряд 100%
  4. IF(DATEDIF(F$1,$B2,"m")>=12,1 Также заряд 100%, если время, прошедшее от F1 до B2, превышает год. Это недосмотр. Условие может быть включено в предыдущее ИЛИ ().
  5. После удаления всех остальных условий остаток представляет собой долю года, которая рассчитывается таким образом, DATEDIF(F$1,$B2,"m")/12. функция DateDif округляет месяцы любым способом. Вы можете использовать «d» и разделить на 365,25, если хотите более точный результат.
  6. Ошибка #NUM возникает в функции DateDif, если конечная дата (F1 для этой функции) предшествует дате начала (B2 ). Эту ошибку в дивизионе уловить не удалось. Поэтому я заключил всю функцию в IFERROR ().
...