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

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
  • Avatar do usuário
Avatar do usuário
Por biligoXD
Avatar
#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.
Código: Selecionar todos
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
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.
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por AfonsoMira
Posts Avatar
#58016
Boas veja se ajuda.

Caso necessite de alterações é só chamar:
Código: Selecionar todos
'---------------------------------------------------------------------------------------
' Autor.....: Afonso Mira
' Contato...: am.afonsomira@gmail.com
' Data......: 18/08/2020
' Descricao.:
'---------------------------------------------------------------------------------------
Sub RetânguloCantosArredondados1_Clique()
    '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.

Dim i                                  As Integer

    '1° Passo: Definir os custos excedentes e redefinir o valor dos produtos cuja soma seja superior ao teto.
    For i = 9 To 15
        '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 Cells(i, 6).Value < Cells(i, 11).Value Then  'Teto do produto no valor atual do loop for menor que a soma atual
            Excedente = Excedente + (Cells(i, 11).Value - Cells(i, 6).Value)
        End If
    Next i

    If Excedente > 0 Then
        For i = 9 To 15
            If Cells(i, 6).Value = Cells(i, 11).Value Then
                noTeto = noTeto + 1
            End If
        Next i

    If noTeto = 7 Then
        Prejuizo = Excedente
        MsgBox "O somatorio resultou em prejuizo de " & Prejuizo
        Exit Sub
    End If


    '4° Passo: Verificar se existem produtos abaixo do Piso, definir o valor total e o peso de distribuição
    For i = 9 To 15
        If Cells(i, 6).Value < Cells(i, 5).Value Then
            diferencial = diferencial + (Cells(i, 5).Value - Cells(i, 11).Value)
            PesoDiferencial = PesoDiferencial + Cells(i, 4).Value
        End If
    Next i
    '5° Passo: Distribuir o Excedente para os produtos com soma abaixo do piso.


    '1° Estagio: Definindo o diferencial total e peso para distribuição.
    For i = 9 To 15
        If Cells(i, 11).Value < Cells(i, 5).Value Then
            DiferencialTotal = DiferencialTotal + (Cells(i, 5).Value - Cells(i, 11).Value)
            PesoDiferencial = PesoDiferencial + Cells(i, 4).Value
        End If
    Next i


    '2° Estagio: Distribuição para atingir o piso.
    For i = 9 To 15
        If Cells(i, 11).Value < Cells(i, 5).Value Then
            ResultadoParcial = ((Cells(i, 4).Value * Excedente) / PesoDiferencial)
            If ResultadoParcial > Cells(i, 5).Value Then
                ResultadoParcialSobra = ResultadoParcialSobra + (ResultadoParcial - Cells(i, 5).Value)
                ResultadoParcial = Cells(i, 5).Value
            ElseIf ResultadoParcial < Cells(i, 5).Value Then
            LucroExcedente = LucroExcedente + (ResultadoParcial - Cells(i, 5).Value)
            ResultadoParcial = Cells(i, 5).Value
        End If
        End If
    Next i
    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.
    For i = 9 To 15
        If Cells(i, 11).Value < Cells(i, 6).Value Then
            DiferencialTotal = DiferencialTotal + (Cells(i, 5).Value - Cells(i, 11).Value)
            PesoDiferencial = PesoDiferencial + Cells(i, 4).Value
        End If
    Next i
    '2° Estagio: Distribuição total do excedente.
    
    For i = 9 To 15
    If Cells(i, 11).Value < Cells(i, 6).Value Then
        ResultadoParcial = ((Cells(i, 4).Value * Excedente) / PesoDiferencial)
        If ResultadoParcial > Cells(i, 6).Value Then
            ResultadoParcialSobra = ResultadoParcialSobra + (ResultadoParcial - Cells(i, 6).Value)
            ResultadoDesejado = Cells(i, 6).Value
        ElseIf ResultadoParcial <= Cells(i, 6).Value Then
        ResultadoDesejado = ResultadoParcial
    End If
    End If
    
    Cells(i, 12).Value = ResultadoDesejado
    
    Next i

    'CONTINUAÇÃO DO 2° PASSO:
    ElseIf Excedente = 0 Then
    For i = 9 To 15
    If Cells(i, 5).Value < Cells(i, 11).Value Then       'Piso do produto no valor atual do loop for menor que a soma atual
    LucroExcedente = LucroExcedente + (Cells(i, 5).Value - Cells(i, 11).Value)
    ResultadoDesejado = Cells(i, 5).Value
    End If
    
    Cells(i, 12).Value = ResultadoDesejado
    Next i
    
    ElseIf 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
End Sub

Avatar do usuário
Por biligoXD
Avatar
#58018
Top!!!

Vou só dar aquela revisada e retoque de leve e retorno, não com essa velocidade toda mais muito obrigado mesmo!
Avatar do usuário
Por AfonsoMira
Posts Avatar
#58020
Depois diga algo, pois eu não percebi muito bem os cálculos apenas me baseei naquilo que me entregou.
Caso precise alterar algo é só chamar. :)
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