Eu não acho que você precise de VBA.
Olhe para SUMIFS ()
Não posso ver suas capturas de tela porque o proxy reverso da minha organização não permite acesso ao app.box, mas estou assumindo:
- A coluna "C" da Folha1 contém localizações.
- A coluna "F" da Folha1 contém itens.
- A coluna "G" da Folha1 contém a quantidade vendida.
- A coluna "A" da Folha2 contém localizações.
- A coluna "D" da Folha2 contém itens.
- A coluna "G" da Folha2 contém quantidade solicitada.
- A coluna "H" da Folha2 contém quantidade devida
Enquanto na planilha2, a quantidade total vendida para o item e o local listados na linha 2 é:
=IF(OR(A2="",D2=""),0,SUMIFS(Sheet1!G:G,Sheet1!C:C,A2,Sheet1:F:F,D2))
Portanto, a fórmula usada para Sheet2! H2 seria simplesmente subtrair isso da quantidade solicitada:
=G2-IF(OR(A2="",D2=""),0,SUMIFS(Sheet1!G:G,Sheet1!C:C,A2,Sheet1:F:F,D2))
Exceto se o pedido for preenchido e um pedido subseqüente para o mesmo local e item tiver sido pelo menos parcialmente preenchido, o total vendido poderá ser maior que o pedido na linha 2 e Encomendado - Vendido será menor que zero! Mas isso é uma coisa fácil de se proteger ...
=MAX(0,G2-IF(OR(A2="",D2=""),0,SUMIFS(Sheet1!G:G,Sheet1!C:C,A2,Sheet1:F:F,D2)))
Mas isso não leva em conta nenhum pedido acima da linha atual! Temos MIN (0, ThisOrderQuantity
- LocationItemQtySold
) quando deveríamos ter MIN (0, ThisOrderQuantity
+ PreviouslyOrderedQuantities
- LocationItemQtySold
) O total de todos os pedidos acima da linha atual na Planilha2 são
=OFFSET(G2,0,0,ROW()-2, 1)
... bem ... que vai quebrar na linha 2. Queremos algo que funcione em todas as linhas, incluindo a primeira. Então, vamos nos proteger na linha 2.
=IF(ROW()<3,0,OFFSET(G2,0,0,ROW()-2, 1))
mas são todos os pedidos anteriores quando queremos apenas pedidos anteriores para o mesmo local e item. Precisamos de outro SUMIFS (). Para a Folha 2, linha 10, isso seria
=IF(ROW()<3,0,SUMIFS(OFFSET(G2,0,0,ROW()-2, 1),OFFSET(A:A,0,0,ROW()-2,1),A10,OFFSET(D:D,0,0,ROW()-2,1),D10))
Ok, agora podemos combiná-los. Para H2, arrastável até a coluna, a fórmula seria:
=MAX(0,G2+IF(OR(A2="",D2=""),0,IF(ROW()<3,0,SUMIFS(OFFSET(G2,0,0,ROW()-2, 1),OFFSET(A:A,0,0,ROW()-2,1),A2,OFFSET(D:D,0,0,ROW()-2,1),D2))-SUMIFS(Sheet1!G:G,Sheet1!C:C,A2,Sheet1:F:F,D2)))
Só que se você tiver três pedidos de localização / item e apenas o primeiro deles for preenchido, a quantidade "devida" desse terceiro será aquela ordem mais a quantidade do pedido do segundo! Precisamos ter certeza de que, se todos os pedidos anteriores ainda não estiverem totalmente preenchidos, isso não estraga nossa quantidade "vencida". Portanto, devemos adicionar uma função MAX para que o que é devido nunca seja maior do que o que foi pedido.
=MIN(G2,MIN(0,G2+IF(OR(A2="",D2=""),0,IF(ROW()<3,0,SUMIFS(OFFSET(G2,0,0,ROW()-2, 1),OFFSET(A:A,0,0,ROW()-2,1),A2,OFFSET(D:D,0,0,ROW()-2,1),D2))-SUMIFS(Sheet1!G:G,Sheet1!C:C,A2,Sheet1:F:F,D2))))
Cole isso no H2, arraste essa fórmula pelo resto de H, depure o que eu fiz (porque, spoiler, eu não), e você está pronto! Não há necessidade de VBA.
(Aviso: você mencionou um "não-problema" de vendas sem pedidos. Considere que, nesse caso, se você tiver um pedido, esse pedido será instantaneamente preenchido !)
Atualização 3 de fevereiro de 2017: Corrigido problema com MIN e MAX; deveria ter sido MAX e MIN.