- 18 Ago 2020 às 04:55
#58012
Boas galera, novato aqui!!!
Primeiramente, honrado em participar de uma nova comunidade, espero que possam me auxiliar nessa nova empreitada para que em um futuro (espero eu que não tão distante) consiga estar auxiliando novos membros.
Meu conhecimento no VBA é muito limitado, sou muito novato no assunto e para minha infelicidade, no meu ponto de vista, possuo uma tarefa árdua pela frente e gostaria de contar com vosso auxilio.
Na planilha anexo possuo um sistema de distribuição de custos mensais para uma quantidade x de produtos, mas para resultar em uma soma perfeita preciso de um loop no sistema para distribuir até o limite.
De uma forma bem leiga redigi um loop totalmente infuncional, mas que (sem nenhum teste) provavelmente está direcionado a resolução da questão.
Primeiramente, honrado em participar de uma nova comunidade, espero que possam me auxiliar nessa nova empreitada para que em um futuro (espero eu que não tão distante) consiga estar auxiliando novos membros.
Meu conhecimento no VBA é muito limitado, sou muito novato no assunto e para minha infelicidade, no meu ponto de vista, possuo uma tarefa árdua pela frente e gostaria de contar com vosso auxilio.
Na planilha anexo possuo um sistema de distribuição de custos mensais para uma quantidade x de produtos, mas para resultar em uma soma perfeita preciso de um loop no sistema para distribuir até o limite.
De uma forma bem leiga redigi um loop totalmente infuncional, mas que (sem nenhum teste) provavelmente está direcionado a resolução da questão.
Código: Selecionar todos
Portanto peço o auxilio para elaboração desta função ou até mesmo um direcionamento mais exato para alguém que não possui conhecimento algum.OBJETIVO: Distribuir os custos excedentes de forma uniforme para os produtos listados, respeitando os valores do teto (valor máximo para o produto), o piso (valor mínimo para o produto) e o peso que é o valor em fração que cada produto irá receber.
1° Passo: Definir os custos excedentes e redefinir o valor dos produtos cuja soma seja superior ao teto.
Loop inicio no Produto1 Final no Produto7 'Criar um loop para somar todo o valor excedente.
'TetoProd corresponde ao valor do TETO na tabela, ValorLup corresponde ao valor atual do loop
If TetoProd & ValorLup < Soma & ValorLup 'Teto do produto no valor atual do loop for menor que a soma atual
Excedente = Excedente + (Soma & ValorLup - TetoProd & ValorLup)
End If
Loop
2° Passo: Se o valor excedente for maior que 0 dar inicio ao próximo loop, caso não seja, verificar se todos os produtos possuem o valor superior ou igual ao piso
Loop If Excedente > 0 Then
3° Passo: Verificar se todos os produtos já não estão com o valor do Teto
Loop Inicio no produto1 final no produto7
If TetoProd & ValorLup = Soma & ValorLup Then
noTeto = noTeto +1
End If
Loop
If noTeto = 7 Then
Prejuizo = Excedente
MsgBox "O somatorio resultou em prejuizo"
Exit Sub
End If
4° Passo: Verificar se existem produtos abaixo do Piso, definir o valor total e o peso de distribuição
Loop Inicio no produto1 Final no produto7
If Soma & ValorLup < Piso & ValorLup Then
Diferencial = Diferencial + (Piso & ValorLup - Soma & ValorLup)
PesoDiferencial = PesoDiferencial + Peso & ValorLup
End If
Loop
5° Passo: Distribuir o Excedente para os produtos com soma abaixo do piso.
1° Estagio: Definindo o diferencial total e peso para distribuição.
Loop Inicio no produto1 Final no produto7
If Soma & ValorLup < Piso & ValorLup Then
DiferencialTotal = DiferencialTotal + (Piso & ValorLup - Soma & ValorLup)
PesoDiferencial = PesoDiferencial + Peso & ValorLup
End If
Loop
2° Estagio: Distribuição para atingir o piso.
Loop Inicio no Produto1 Final no produto7
If Soma & ValorLup < Piso & ValorLup Then
ResultadoParcial & ValorLup = ((Peso & ValorLup *Excedente)/ PesoDiferencial)
If ResultadoParcial & ValorLup > Piso & ValorLup Then
ResultadoParcialSobra = ResultadoParcialSobra + (ResultadoParcial & ValorLup - Piso & ValorLup)
ResultadoParcial & ValorLup = Piso & ValorLup
ElseIf ResultadoParcial & ValorLup < Piso & ValorLup Then
LucroExcedente = LucroExcedente + (ResultadoParcial & ValorLup - Piso & ValorLup)
ResultadoParcial & ValorLup = Piso & ValorLup
End If
End If
Loop
Excedente = Excedente + ResultadoParcialSobra
DiferencialTotal = 0 'Limpar a string de soma para o próximo loop
PesoDiferencial = 0
6° Passo: Distribuição total do excedente respeitando o peso e teto.
1° Estagio: Definindo o diferencial total e peso para distribuição.
Loop Inicio no produto1 Final no produto7
If Soma & ValorLup < Teto & ValorLup Then
DiferencialTotal = DiferencialTotal + (Piso & ValorLup - Soma & ValorLup)
PesoDiferencial = PesoDiferencial + Peso & ValorLup
End If
Loop
2° Estagio: Distribuição total do excedente.
If Soma & ValorLup < Teto & ValorLup Then
ResultadoParcial & ValorLup = ((Peso & ValorLup *Excedente)/ PesoDiferencial)
If ResultadoParcial & ValorLup > Teto & ValorLup Then
ResultadoParcialSobra = ResultadoParcialSobra + (ResultadoParcial & ValorLup - Teto & ValorLup)
ResultadoDesejado & ValorLup = Teto & ValorLup
ElseIf ResultadoParcial & ValorLup <= Teto & ValorLup Then
ResultadoDesejado & ValorLup = ResultadoParcial & ValorLup
End If
End If
- CONTINUAÇÃO DO 2° PASSO:
ElseIf Excedente = 0 Then
Loop inicio no Produto1 Final no Produto7
If PisoProd & ValorLup < Soma & ValorLup 'Piso do produto no valor atual do loop for menor que a soma atual
LucroExcedente = LucroExcedente + (PisoProd & ValorLup - Soma & ValorLup)
ResultadoDesejado & ValorLup = PisoProd & ValorLup
End If
Loop
Else Excedente < 0 Then
MsgBox: Ocorreu um erro inesperado no somatório e o valor excedente foi distribuído de forma incorreta, verifique a formula e distribuição de valores negativos.
Exit Sub
End If
Loop
End Sub
Você não está autorizado a ver ou baixar esse anexo.
Atenciosamente,
Antonio Dias!
Antonio Dias!