1

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

Это мой рабочий лист:

Скриншот рабочего листа

Базовые данные для заказов 2018 года находятся в ячейках F6:Q9 .

Базовые данные для заказов 2019 года находятся в ячейках S6:AD9 .

В настоящее время есть заказ на март 2018 года (ячейка H6), и в профиле выручки должна быть задержка на 1 месяц, поэтому выручка за апрель не будет, но с мая 2018 года мартовский заказ в размере 20 000 фунтов стерлингов должен начать отражать 1 667 фунтов стерлингов (вплоть до Апрель 2019 г.)

Формула также должна учитывать как заказы из F6:Q9 (заказы 2018 года), так и из S6:AD9 (заказы 2019 года).

В ячейку I1 я ввел 1 (для отражения задержки на один месяц).

В ячейку I2 я ввел 12 (чтобы отразить количество месяцев, в течение которых доход должен быть ровным).

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

Я пытался использовать формулу смещения, но не смог заставить ее работать. Я не знаю, как подойти к решению.

1 ответ1

0

Требуемая формула представляет собой немного сложную формулу массива.

Вот ваша таблица с формулой, показывающей ожидаемые результаты:

Снимок экрана рабочего листа

Эта формула должна быть введена в массив в AE6 а затем заполнена / скопирована вниз и вправо, насколько это необходимо):

{=SUM(IFERROR(INDEX(6:6,N(IF(1,COLUMN()-(COLUMN($AE:$AE)-COLUMN($F:$F))-COLUMN(INDEX(6:6,1):INDEX(6:6,$I$2))-$I$1))+(COLUMN()-(COLUMN($AE:$AE)-COLUMN($F:$F))-COLUMN(INDEX(6:6,1):INDEX(6:6,$I$2))-$I$1>=COLUMN($R:$R)))/$I$2,0))}

Объяснение:

Предварительно подтвержденный вариант формулы выглядит следующим образом:

{=
SUM(
  IFERROR(
    INDEX(
      (6:6),
      N(IF(1,COLUMN()-(COLUMN($AE:$AE)-COLUMN($F:$F))-COLUMN(INDEX(6:6,1):INDEX(6:6,$I$2))-$I$1))
      +(COLUMN()-(COLUMN($AE:$AE)-COLUMN($F:$F))-COLUMN(INDEX(6:6,1):INDEX(6:6,$I$2))-$I$1>=COLUMN($R:$R))
    )/$I$2,
    0
  )
)}

Формула будет намного легче понять, если учесть, что для продолжительности 12 месяцев и задержки в 1 месяц второй аргумент первого INDEX() примерно эквивалентен:

COLUMN()-(COLUMN($AE:$AE)-COLUMN($F:$F))-{1,2,3,4,5,6,7,8,9,10,11,12}-1

Формула в основном работает, генерируя массив смещений для доступа к порядкам предыдущего числа I2 месяцев с задержкой на I1 месяца относительно текущей ячейки.


Пройдя по формуле в AK6 следует прояснить вышесказанное:

  • COLUMN(INDEX(6:6,1):INDEX(6:6,$I$2))
    {1,2,3,4,5,6,7,8,9,10,11,12}
  • COLUMN()-(COLUMN($AE:$AE)-COLUMN($F:$F))-{1,2,3,4,5,6,7,8,9,10,11,12}-$I$1
    {37}-({31}-{6})-{1,2,3,4,5,6,7,8,9,10,11,12}-1
    {10,9,8,7,6,5,4,3,2,1,0,-1}
  • N(IF(1,{10,9,8,7,6,5,4,3,2,1,0,-1}))
    N({10,9,8,7,6,5,4,3,2,1,0,-1})
    {10,9,8,7,6,5,4,3,2,1,0,-1}
  • {10,9,8,7,6,5,4,3,2,1,0,-1}+({10,9,8,7,6,5,4,3,2,1,0,-1}>=COLUMN($R:$R))
    {10,9,8,7,6,5,4,3,2,1,0,-1}+({10,9,8,7,6,5,4,3,2,1,0,-1}>={18})
    {10,9,8,7,6,5,4,3,2,1,0,-1}+{0,0,0,0,0,0,0,0,0,0,0,0}
    {10,9,8,7,6,5,4,3,2,1,0,-1}
  • INDEX((6:6),{10,9,8,7,6,5,4,3,2,1,0,-1})/$I$2
    INDEX(6:6,{10,9,8,7,6,5,4,3,2,1,0,-1})/12{24000,0,20000,0,0,"Opportunity Name1","bWmd1","Col C val","Col B val","Col A val","Col A val",#VALUE!}/12
    {2000,0,1666.67,0,0,#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!}
  • SUM(IFERROR({2000,0,1666.67,0,0,#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!},0))
    2666.67

INDEX(6:6,N(IF(1,expression))) является обязательным хаком * , чтобы заставить Excel возвращать массив для expression так как второй аргумент INDEX() оценивается в одно значение по умолчанию. Использование только INDEX(6:6,expression) в AK6 приведет к

INDEX((6:6),COLUMN()-(COLUMN($AE:$AE)-COLUMN($F:$F))-COLUMN(INDEX(6:6,1):INDEX(6:6,$I$2))-$I$1+(COLUMN()-(COLUMN($AE:$AE)-COLUMN($F:$F))-COLUMN(INDEX(6:6,1):INDEX(6:6,$I$2))-$I$1>=COLUMN($R:$R)))
INDEX(6:6,37-(31-6)-COLUMN($A$6:$L$6)-1+(37-(31-6)-COLUMN($A$6:$L$6)-1>=18))
INDEX(6:6,12-1-1+(12-1-1>=18))
INDEX(6:6,10)
24000

поскольку внутри выражения, возвращающего одно значение, COLUMN(multi-cell-range) возвращает столбец первой ячейки диапазона.

+(COLUMN()-(COLUMN($AE:$AE)-COLUMN($F:$F))-COLUMN(INDEX(6:6,1):INDEX(6:6,$I$2))-$I$1>=COLUMN($R:$R)) корректирует разрыв между таблицами заказов на 2018 и 2019 годы (столбец R). Обратите внимание, что N(IF( hack) в этом случае не требуется, так как ранее использованный хак уже вынудил оценку массива второго аргумента INDEX и, таким образом, функцию COLUMN() оценила массивы).

Функция IFERROR() требуется в том случае, если формула существует в ячейке рядом с левой стороной листа, что приводит либо к доступу к тексту, либо к попытке доступа к ячейке слева от столбца A

Заметки:

  • Предварительно подтвержденная формула действительно работает, если введена.
  • Квадратные скобки (6:6) в предварительно проверенной версии должны заставить 6:6 оставаться на своей линии.

Предостережения:

  • В ячейках n столбцов слева от ордеров не должно быть чисел (где n определяется значением в I2). Если там есть какие-либо числа, формула, как есть, будет включать их в расчет выручки.
  • Между столбцами «Доход за декабрь 2018 года» и «Доход за январь 2019 года» не может быть разрыва. Формула может быть изменена, чтобы учесть такой разрыв, если таковой необходим.
  • Разрыв между двумя таблицами заказов (R:R) должен составлять ровно один столбец. В противном случае формула, как есть, сломается.
  • Разрыв между таблицами заказов не может содержать чисел. В противном случае они будут рассматриваться как дополнительные заказы.

* Объяснение того, почему хак работает, придется подождать, пока я сам не пойму ;-)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .