A fórmula necessária é uma fórmula de matriz um pouco complicada.
Aqui está sua planilha com a fórmula que mostra os resultados esperados:

Essa fórmula precisa ser inserida na matriz e, em AE6
seguida, preenchida / copiada e colada, à direita, na medida do necessário):
{=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))}
Explicação:
A versão pré-modificada da fórmula é a seguinte:
{=
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
)
)}
A fórmula é muito mais fácil de entender se você considerar que por um período de 12 meses e um atraso de 1 mês, o segundo argumento do primeiro INDEX()
é aproximadamente equivalente a:
COLUMN()-(COLUMN($AE:$AE)-COLUMN($F:$F))-{1,2,3,4,5,6,7,8,9,10,11,12}-1
A fórmula basicamente funciona gerando uma matriz de compensações para acessar os pedidos do I2
número anterior de meses, atrasados por I1
meses, em relação à célula atual.
Percorrer a fórmula em AK6
deve tornar o acima claro:
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)))
é um hack necessário * para forçar o Excel a retornar uma matriz, expression
pois o segundo argumento de INDEX()
é avaliado como um único valor por padrão. Usar just in levaria aINDEX(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
como dentro de uma expressão retornando um único valor, retorna a coluna da primeira célula do intervalo.COLUMN(multi-cell-range)
Ele +(COLUMN()-(COLUMN($AE:$AE)-COLUMN($F:$F))-COLUMN(INDEX(6:6,1):INDEX(6:6,$I$2))-$I$1>=COLUMN($R:$R))
ajusta a diferença entre as tabelas de pedidos para 2018 e 2019 (coluna R
). Observe que o N(IF(
hack não é necessário neste caso, pois o hack usado anteriormente já forçou uma avaliação de matriz do segundo argumento de INDEX
e, portanto, a COLUMN()
função é avaliada em matrizes.
A IFERROR()
função é necessária caso a fórmula exista em uma célula próxima ao lado esquerdo da planilha, resultando no acesso ao texto ou na tentativa de acessar uma célula à esquerda da coluna A
.
Notas:
- A fórmula prettificada realmente funciona se inserida.
- Os colchetes
(6:6)
na versão prettificada são obrigados a forçar a 6:6
permanecer em sua própria linha.
Ressalvas:
- Não pode haver números nas células das n colunas à esquerda dos pedidos (em que n é especificado pelo valor em
I2
). Se houver números, a fórmula, como está, os incluirá no cálculo da receita.
- Não pode haver diferença entre as colunas Receita de dezembro de 2018 e Receita de janeiro de 2019. A fórmula pode ser modificada para permitir essa lacuna, se desejar.
- O espaço entre as duas tabelas de pedidos (
R:R
) deve permanecer exatamente com uma coluna de largura. Caso contrário, a fórmula, como está, será quebrada.
- O espaço entre as tabelas entre ordens não pode conter números. Caso contrário, eles serão tratados como pedidos adicionais.
* A explicação exata do motivo pelo qual o hack funciona terá que esperar até que eu descubra primeiro ;-)