Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Dúvidas sobre cálculos, funções simples e aninhadas, fórmulas matriciais, etc.
  • Avatar do usuário
  • Avatar do usuário
Por renaneemm
Posts
#65562
Boa tarde a todos do fórum!

Aprendi muito vendo exemplos e raciocínios que utilizaram aqui no fórum, então venho tirar uma dúvida que não consegui resolver há meses já.

Tenho uma coluna de valores que distribuo entre 3 clientes, e tento fazer com que no final, a soma de cada um dos 3 sejam o mais próxima possível.

VALORES 1,2,3 CLIENTE A CLIENTE B CLIENTE C
2,00 1 2,00 0,00 0,00
3,00 1 0,00 3,00 0,00
8,00 2 4,00 0,00 4,00
10,00 2 0,00 5,00 5,00
15,00 3 5,00 5,00 5,00
1,00 1 1,00 0,00 0,00

somas 12,00 13,00 14,00



Segue em anexo a planilha de um exemplo que consegui fazer com que se distribuam entre 2, porém não consigo ter nenhum raciocínio para que conte como 3 pessoas a ser distribuído.

Alguém teria uma luz para me auxiliar com isso?

Desde já, obrigado.
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por Deciog
Avatar
#65566
renaneemm, Boa tarde

Fiquei com muita duvida, explica com detalhe como chegou ao resultado na linha 5

Decio
Por osvaldomp
#65573
Veja se ajuda.

Em K4 e arraste para L4
=ARRED($I4/3;0)

Em M4
=I4-K4-L4

Selecione K4:M4 e arraste para baixo.
Por renaneemm
Posts
#65578
Bom dia! Obrigado pelo retorno Osvaldomp.
Infelizmente a fórmula não deu certo
Segue uma imagem do resultado

Imagem

Nem sempre tem a divisão para todos, este é o problema, pois depende do 1,2,3 que selecionar na coluna C:C
Por osvaldomp
#65579
renaneemm escreveu: 07 Jul 2021 às 09:46 Segue uma imagem do resultado
É estranho pois aqui as fórmulas que passei retornam resultados diferentes dos seus. Veja na imagem abaixo e no arquivo anexado.

Nem sempre tem a divisão para todos, este é o problema, pois depende do 1,2,3 que selecionar na coluna C:C
Não entendi. Qual o significado desses valores da coluna C? Eles devem ser considerados nos cálculos da distribuição dos valores? E os valores da coluna J ?
O único critério que você informou antes foi este ~~~> "Tenho uma coluna de valores que distribuo entre 3 clientes, e tento fazer com que no final, a soma de cada um dos 3 sejam o mais próxima possível."
Imagem
Você não está autorizado a ver ou baixar esse anexo.
Por renaneemm
Posts
#65595
@osvaldomp tudo bem?
Quanto ao
"É estranho pois aqui as fórmulas que passei retornam resultados diferentes dos seus. Veja na imagem abaixo e no arquivo anexado."
Acho que estamos com uma divergência na comunicação apenas, vou explicar melhor.
"Não entendi. Qual o significado desses valores da coluna C? Eles devem ser considerados nos cálculos da distribuição dos valores? E os valores da coluna J ?"
Inseri duas tabelas,
uma da B a F, que faz os cálculos para 2 clientes
uma da I a M, de exemplo que é feito a mão a distribuição como deveria ser, o ideal (sem fórmulas). Essa é apenas um exemplo
A coluna C é a entrada de decisão em quantos clientes vou distribuir (1, 2 ou 3).
Se colocar 1, não importa quem seja, o valor vai apenas pra 1.
Se colocar 2, não importa quem sejam, vai dividido para 2. O mesmo para 3...
O que importa apenas é a soma da linha 1 da coluna D,E,F estarem bem próximas.

Consegui explicar melhor para entender? Acho que havia explicado mal, me desculpe com isso.
Por osvaldomp
#65650
Olá, @renaneemm .

Veja se a solução por macro que está no arquivo anexado lhe atende.
Você não está autorizado a ver ou baixar esse anexo.
renaneemm agradeceu por isso
Por renaneemm
Posts
#65663
@osvaldomp muito obrigado pelo retorno e pela planilha.
Fiz uma visualização rápida e ficou 10 até então. Vou depois testar com outros valores e dou o feedback, mas desde já agradeço demais
Parabéns pelo raciocínio no vba, vi e foi bem preciso!
Por renaneemm
Posts
#65666
osvaldomp escreveu: 10 Jul 2021 às 22:30 Olá, @renaneemm .

Veja se a solução por macro que está no arquivo anexado lhe atende.
Bom dia @osvaldomp
Fiz testes com uns valores que costumo utilizar, a maioria deu certo (bem melhor do que eu usava inicialmente)

Imagem

em alguns casos, como no da imagem, com set de 2 na J11, ele coloca o valor em apenas uma.
Vi o raciocínio no VBA mas não sei como ajustar
Mas foram 2 casos que ocorreu assim dos que testei, como mencionei, na maioria deu certo, fiquei feliz com isso e te agradeço!
Caso seja de fácil ajuste este caso, eu aceito, senão já está bom demais assim!

Obrigado @osvaldomp
Por osvaldomp
#65686
renaneemm escreveu: 12 Jul 2021 às 09:53 em alguns casos, como no da imagem, com set de 2 na J11, ele coloca o valor em apenas uma.
Esse "erro" (que na prática não é um erro pois o que importa é o total recebido por cada um), ocorre porque a fórmula considera somente valores inteiros na coluna I, conforme os seus exemplos anteriores, porém você introduziu valores decimais.
Para trabalhar também com valores decimais basta remover a função INT() das fórmulas. Cole uma cópia do código abaixo, que já está atualizado sem a função INT(), no lugar do existente no arquivo que postei.
#
Código: Selecionar todos
Sub DistribuiValores()
 Dim vArr As Variant, k As Long, rng As Range, x As Long
  Application.ScreenUpdating = False
  [K4:M50] = "": k = 100
  Set rng = Range("K4:M" & Cells(Rows.Count, 9).End(3).Row)
  rng(1, 1).Resize(rng.Rows.Count) = "=IF(J4=1,CHOOSE(RANDBETWEEN(1,2),0,I4),IF(J4=2,CHOOSE(RANDBETWEEN(1,2),0,I4/2),I4/J4))"
  rng(1, 2).Resize(rng.Rows.Count) = "=IF(AND(J4=1,K4>0),0,IF(J4=1,CHOOSE(RANDBETWEEN(1,2),0,I4),IF(AND(J4=2,K4=0),I4/2,IF(J4=2,CHOOSE(RANDBETWEEN(1,2),0,I4/2),I4/J4))))"
  rng(1, 3).Resize(rng.Rows.Count) = "=I4-K4-L4"
  For x = 1 To 1000
   ActiveSheet.Calculate
   If Evaluate("MAX(K2:M2)-MIN(K2:M2)") = 0 Then vArr = rng.Value: Exit For
   If Evaluate("MAX(K2:M2)-MIN(K2:M2)") < k Then vArr = rng.Value: k = Evaluate("MAX(K2:M2)-MIN(K2:M2)")
  Next x
  Range("K4").Resize(rng.Rows.Count, 3).Value = vArr
End Sub
#
Montei a tabela aqui com os valores do seu último exemplo e a menor diferença (rodei o código acima 5 vezes) foi de 2,90, que representa um desvio de 1,9% do valor total distribuído.

Por outro lado, o código anterior retornou 1,20 como a menor diferença, ou seja, apesar do "erro" a precisão foi maior: desvio de 0,8% do valor total.

Vou tentar melhorar a precisão (é improvável que eu consiga), enquanto isso teste os dois códigos com outros valores e veja se os resultados são aceitáveis.
Editado pela última vez por osvaldomp em 13 Jul 2021 às 08:42, em um total de 1 vez.
renaneemm agradeceu por isso
Por renaneemm
Posts
#65701
@osvaldomp
Está excelente com este código. Ocorre apenas com um valor normalmente, apenas um vou alterar manualmente.
Agradeço demais pela prestividade e pelo raciocinio que desenvolveu para o código.
:D
Por osvaldomp
#65702
renaneemm escreveu: 13 Jul 2021 às 08:03 Está excelente com este código.
Se você se refere ao primeiro código, devido à função INT(), o "erro" ocorrerá sempre que o valor a ser distribuído for menor do que o número indicado de clientes, ou seja, se I < J.
... apenas um vou alterar manualmente.
Para facilitar a identificação do "erro" você pode aplicar Formatação Condicional, veja abaixo.
Formatação Condicional:
1. selecione a tabela, por exemplo I4:M20
2. menu Página Inicial | Formatação Condicional | Nova Regra | Usar uma fórmula ...
3. na caixa de fórmula cole uma cópia desta fórmula ~~~> =$J4<>CONT.SE($K4:$M4;">0")
4. formate como desejar
renaneemm agradeceu por isso
Por renaneemm
Posts
#65769
osvaldomp escreveu:
renaneemm escreveu: 13 Jul 2021 às 08:03 Está excelente com este código.
Se você se refere ao primeiro código, devido à função INT(), o "erro" ocorrerá sempre que o valor a ser distribuído for menor do que o número indicado de clientes, ou seja, se I < J.
... apenas um vou alterar manualmente.
Para facilitar a identificação do "erro" você pode aplicar Formatação Condicional, veja abaixo.
Formatação Condicional:
1. selecione a tabela, por exemplo I4:M20
2. menu Página Inicial | Formatação Condicional | Nova Regra | Usar uma fórmula ...
3. na caixa de fórmula cole uma cópia desta fórmula ~~~> =$J4<>CONT.SE($K4:$M4;">0")
4. formate como desejar
Nota 10. Deu certo, poxa nem acredito que essa planilha foi resolvida
@osvaldomp muito obrigado!

Vou procurar como coloca a publicação como resolvida, ficou show!
osvaldomp agradeceu por isso
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord