Я думаю, у меня есть решение для вас. Обсуждение последует, но вот полная формула:
=CONCAT("FY",RIGHT(YEAR(D5+91+WEEKDAY(DATE(YEAR(D5),10,1))),2),"P",TEXT(IF(MONTH(D5+(7-WEEKDAY(D5)))<>MONTH(D5),IF(MONTH(D5)=9,1,CHOOSE(MONTH(D5),5,6,7,8,9,10,11,12,1,2,3,4)),CHOOSE(MONTH(D5),4,5,6,7,8,9,10,11,12,1,2,3)),"0#"),"W",ROUNDUP(((D5-IF(MONTH(D5+(7-WEEKDAY(D5)))<>MONTH(D5),DATE(YEAR(D5),MONTH(D5)+1,1)-WEEKDAY(DATE(YEAR(D5),MONTH(D5)+1,1))+1,DATE(YEAR(D5),MONTH(D5),1)-WEEKDAY(DATE(YEAR(D5),MONTH(D5),1))+1))/7)+0.01,0))
Одна проблема состоит в том, что это все равно вычисляет 2/2/2020 так, как вы сказали, было неправильно. Однако, когда я проверяю это по календарю, кажется, что FY20P05W02 должен быть верным. Если неделя, включающая первое число месяца, начинает новый период оплаты, это будет означать, что 1 февраля 2020 г., приходящееся на субботу, будет последним днем 1-й финансовой недели. Это будет 2 февраля 2020 г. день фискальной недели 2.
Для расчета фискального года я использовал RIGHT(YEAR(D5+91+WEEKDAY(DATE(YEAR(D5),10,1))),2)
. Поскольку вы можете рассчитывать на 91 день с начала октября до конца декабря, это помогает при таком расчете. В вашей формуле у вас было MONTH(D5)+(10-1)
, что равнялось бы вам sh через 9 месяцев после месяца в D5
. Это объясняет, почему ваш результат за 4/5/2020 был на год меньше.
Финансовый период был немного сложнее, потребовалось несколько вложенных операторов IF
. Сначала я использовал IF(MONTH(D5+(7-WEEKDAY(D5)))<>MONTH(D5)
для учета дней в конце месяца, которые приходятся на следующий финансовый период, а затем IF(MONTH(D5)=9
для учета нескольких дней в конце сентября, которые могут приходиться на следующий финансовый год. Дни в конце сентября по умолчанию будут равны 1
, дни в конце месяца, включенные в следующий финансовый период, используют первую функцию CHOOSE
(им нужен номер следующего месяца), а все остальное получает CHOOSE
функция, как вы ее написали.
Финансовая неделя заняла немного больше, но в итоге я оценил начало текущего финансового месяца и вычел его из даты в D5
, затем разделил на 7 и добавил 0,01, чтобы четные числа округлялись правильно.
Я проверял это в течение нескольких лет, и казалось, что он работает правильно, но дайте мне знать, если у вас есть вопросы или проблемы.
При использовании WEEKNUM
необходимо учитывать, что в начале года у вас будет неделя, которая считается дважды, если вы не используете опцию 21 или ISOWEEKNUM
. Они дают тот же результат, что и каждый другой, и гарантируют, что для каждого дня независимо от года назначается только один номер недели.