Cálculo Preço Médio...
 
Notifications
Clear all

Cálculo Preço Médio Ponderado

11 Posts
5 Usuários
0 Likes
2,485 Visualizações
(@luis-p)
Posts: 16
Active Member
Topic starter
 

Pessoal, boa noite!
Antes de abrir este tópico, segui as orientações dos moderadores e realizei várias pesquisas relacionadas ao assunto. Encontrei alguns tópicos semelhantes, mas as soluções apresentadas não atenderam a minha necessidade. Como sou novo no fórum, eventualmente algum tópico relacionado ao tema pode ter passado despercebido, portanto de ante mão peço desculpas aos colegas.
Minha necessidade consiste em criar uma macro ou mesmo uma fórmula que calcule o preço médio ponderado de uma determinada ação, todas as vezes que a planilha recebe a inserção de uma nova compra.

Exemplificando:
Na coluna B temos os nomes das Corretoras
Na coluna C temos os nomes dos Ativos (ações de determinadas empresas)
Na coluna D temos a quantidade comprada
Na coluna F temos o preço médio de compra
Na coluna H temos o preço médio ponderado de Compra (nesta coluna é que necessito que o excel demonstre o resultado do cálculo)

Premissas:
1) O preço médio ponderado deve ser calculado por Corretora e por Ativo, ou seja, se e base de dados conter várias compras de um mesmo Ativo (ex. Vale3) realizadas em duas ou mais Corretoras (ex. Bradesco e Clear), a planilha deverá mostrar um preço médio ponderado para o Ativo Vale3 na Corretora Bradesco e um preço médio ponderado para o Ativo Vale3 na Corretora Clear.
2) Uma vez calculado o preço médio ponderado de um determinado Ativo por Corretora (ex. Vale3 - Bradesco), a macro deverá popular o resultado em todas as linhas da planilha que conter na coluna B o nome Bradesco e na coluna C o Ativo Vale3.
3)A cada inserção de novos dados na planilha o preço médio ponderado deverá ser recalculado e a nova média deverá ser demonstrada na coluna H e em todas as linhas que contém o respectivo Ativo e Corretora, com explicado no item 2 acima.

Estou inserindo um arquivo no tópico, visando ajudar no entendimento da minha necessidade.

Agradeço a ajuda dos colegas.

Luís

 
Postado : 18/04/2018 9:56 pm
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

Luis.p,

Bom dia!

Seja muito bem vindo ao fórum.

Para aproveitar ao máximo o fórum e sempre manter o mesmo de forma organizada, sugiro ler os tópico da regras abaixo:
viewtopic.php?f=7&t=16757
viewtopic.php?f=7&t=203
viewtopic.php?f=7&t=7903
viewtopic.php?f=7&t=3841
viewtopic.php?f=7&t=12600
viewtopic.php?f=7&t=3371

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 19/04/2018 6:20 am
pfarias
(@pfarias)
Posts: 265
Reputable Member
 

Bom dia!

O uso de tabela dinâmica + o powerpivot não seria a solução?
Veja o exemplo em anexo no link abaixo.
Arquivo Exemplo - Média Ponderada

Com este exemplo, é só adicionar no final da tabela as novas compras, que é retornado na tabela dinâmica.

Se precisar de ajuda para ativar o PowerPivot no Excel, segue o link ensinando:
Inicie o suplemento PowerPivot para Excel

Pietro Farias

Se foi resolvido suas dúvidas, lembre se de marcar o tópico como RESOLVIDO.

ANALISTA X

 
Postado : 19/04/2018 6:20 am
(@luis-p)
Posts: 16
Active Member
Topic starter
 

Boa tarde Pietro Farias!
Primeiramente, obrigado pela dica acerca da utilização do powerpivot!!

Apenas por curiosidade. O cálculo que vc fez através do powerpivot, não seria o mesmo que inserir um campo calculado na tabela dinâmica para calcular a média?

Sobre a sua sugestão, vi a planilha que vc disponibilizou. O valores calculados refletem corretamente os preços médios ponderados por Corretora e Ativo, entretanto como solucionar a questões abaixo que descrevi nas premissas 2 e 3 no meu tópico:

2) Uma vez calculado o preço médio ponderado de um determinado Ativo por Corretora (ex. Vale3 - Bradesco), a macro deverá popular o resultado em todas as linhas da planilha que conter na coluna B o nome Bradesco e na coluna C o Ativo Vale3.

3)A cada inserção de novos dados na planilha o preço médio ponderado deverá ser recalculado e a nova média deverá ser demonstrada na coluna H e em todas as linhas que contém o respectivo Ativo e Corretora, com explicado no item 2 acima.

Exemplo:
DIA CORRETORA ATIVO QTDE PREÇO PREÇO MÉDIO PONDERADO
01/01/18 Bradesco Vale3 100 40,00 40,00 (Esse valor de 40,00 será substituído pelo valor de 41,33 e depois por 40,16)
02/01/18 Bradesco Vale3 200 42,00 41,33 (Esse valor de 41,33 será substituído pelo valor de 40,16)
03/01/18 Bradesco Vale3 300 39,00 40,16

Imagine que tenho uma planilha nos moldes que disponibilizei, entretanto contendo uma robusta base de dados com várias operadoras e ativos, formando inúmeras variáveis. O que preciso é quando eu digitar um novo dado na minha planilha (exemplo acima), ela envie as informações para outra base ou para uma tabela dinâmica, que, na sua sugestão, fará o cálculo do preço médio ponderado e devolverá imediatamente este cálculo para a minha planilha (coluna H - Preço Médio Ponderado).
É fato que a tabela dinâmica recalcula o preço médio ponderado a cada inserção de dados na base da minha planilha, todavia será preciso fazer uma atualização manual da tabela dinâmica, o que torna o procedimento inviável.
Eu sei que poderia criar uma macro para atualizar os dados da tabela dinâmica, mas a minha expectativa é ter um processo mais automático, ou seja, a partir da digitação de novos dados na planilha, uma macro rodaria e traria na coluna h da minha planilha o preço médio ponderado em todas as linhas cuja a corretora e o ativo forem os mesmos. No exemplo acima, os dias 01, 02 e 03 mostraria o preço médio ponderado de 40,16.

 
Postado : 19/04/2018 10:08 am
(@luis-p)
Posts: 16
Active Member
Topic starter
 

Exemplo 1:
Se vc vende todos os ativos (300), o preço médio que deve ficar fixado é o ultimo, em nosso exemplo é $ 11,00
Exemplo 2:
Se vc vende parcialmente os ativos (100) e até que ocorra outra compra, permanece a mesma média $11,00
Exemplo 3:
Se vc vende mais uma vez parcialmente os ativos (100) e até que ocorra outra compra, permanece a mesma média de $ 11,00

Obs. O seu código já estava fazendo isso. Em outras mensagens eu respondi o seu colega que as vendas não podiam interferir no cálculo do preço médio de compra, ao menos que ocorra nova compra.

Exemplo 4:
Após uma venda (exemplo qtde 100), quando ocorre nova compra (exemplo qtde 100 x preço $ 13,00, o código tem que ler o saldo que sobrou (nosso exemplo qtde 200 x preço médio $11,00) e somar a nova compra (qtde 100 e preço $ 13,00) e encontrar um novo preço médio, no exemplo $11,67.

Na planilha que te enviei simula todos esses cenários. Se mesmo após essa explicação não ficar claro, me avise que faço cópia da planilha que te enviei e monto os 3 cenários, mas o resultado é esse que te informei.

Tenha em mente que podem ocorrer uma ou várias vendas que o preço médio não vai mudar (foi por isso que pedi pra vc fixar o preço médio na linha da venda ou das vendas e o seu código fez isso). Agora assim que entrar uma nova compra, ai sim, o código tem que pega a quantidade remanescente que será multiplicada pelo preço médio atual (no nosso exemplo $11,00) e encontrar um novo preço médio, considerando os novos dados de quantidade e preço (no nosso exemplo $ 11,67).

 
Postado : 01/05/2018 10:54 pm
(@luis-p)
Posts: 16
Active Member
Topic starter
 

klarc28,

Refiz os testes e informo que o código funcionou. Desta vez o note travou menos, mas tive que reinicia-lo.

Fica inviável usar o código se os travamentos forem frequentes. Além do que testei com 30 linhas de digitação, mas minha planilha terá cerca de 100 linhas por mês.

Você acha que o código ficaria mais rápido se ao invés de termos 12 planilhas, a gente ter apenas uma planilha e colocar no código mais uma variável mês/ano para calcular o preço médio ponderado? Neste exemplo, o código precisará encontrar as variáveis “ativo”, “corretora”, “jan/18” para fazer o cálculo.

 
Postado : 06/05/2018 1:50 pm
(@klarc28)
Posts: 971
Prominent Member
 
Option Explicit
Dim tbcongelada(1000000, 5) As Variant
Dim colunaB(1000000) As String
Dim tbprincipal(3 To 100000, 7) As Variant
Dim linhaspreenchidas As Long

Public NomePlan As String
    
Sub CalcularPrecoMedio()
    
    'On Error GoTo fim
    Erase colunaB
    Dim linha As Long
    Dim linha2 As Long
    Dim precomedio As Double
    Dim achou As Boolean
    Dim corretora As String
    Dim ativo As String
    Dim linha3 As Long
    Dim linha7 As Long
    Dim LINFINAL As Long
    Dim LININICIAL As Long
    Dim LINHA9 As Long
    Dim PRECO As Double
    
    
    
    
    Dim achouvenda As Boolean
    
    
    Dim linTbPrincipal As Long
    Dim LR As Long
    linha3 = 3
    
    linhaspreenchidas = 3
    While Sheets(NomePlan).Range("F" & linhaspreenchidas).Value <> ""
        
        linhaspreenchidas = linhaspreenchidas + 1
    Wend
    LR = linhaspreenchidas - 1
    Dim PREENCHEU As Boolean
    For linTbPrincipal = 3 To LR
        PREENCHEU = False
        
        If Sheets(NomePlan).Range("F" & linTbPrincipal).Value <> "" Then
            If Sheets(NomePlan).Range("T" & linTbPrincipal).Value <> "" Then
                If Sheets(NomePlan).Range("U" & linTbPrincipal).Value <> "" Then
                    If Sheets(NomePlan).Range("AB" & linTbPrincipal).Value <> "" Then
                        PREENCHEU = True
                        
                        tbprincipal(linTbPrincipal, 0) = Sheets(NomePlan).Range("B" & linTbPrincipal).Value
                        tbprincipal(linTbPrincipal, 1) = Sheets(NomePlan).Range("F" & linTbPrincipal).Value
                        tbprincipal(linTbPrincipal, 2) = Sheets(NomePlan).Range("T" & linTbPrincipal).Value
                        tbprincipal(linTbPrincipal, 3) = Sheets(NomePlan).Range("U" & linTbPrincipal).Value
                        tbprincipal(linTbPrincipal, 4) = Sheets(NomePlan).Range("AB" & linTbPrincipal).Value
                        tbprincipal(linTbPrincipal, 5) = Sheets(NomePlan).Range("AC" & linTbPrincipal).Value
                    End If
                End If
            End If
        End If
        
    Next linTbPrincipal
    
    If PREENCHEU = False Then
        Exit Sub
    End If
    
    '   Application.EnableEvents = False
    
    '    linhaspreenchidas = 3
    '
    '
    '    While tbprincipal(linhaspreenchidas, 2) <> ""
    '
    '        linhaspreenchidas = linhaspreenchidas + 1
    '    Wend
    
    linha = 3
    While tbprincipal(linha, 2) <> ""
        If linhaspreenchidas > 4 Then
            If tbprincipal(linha, 0) <> "ZERADA" Then
                If tbprincipal(linha, 3) <> "" Then
                    If tbprincipal(linha, 1) <> "" Then
                        If VerificarQuantidade(tbprincipal(linha, 2), tbprincipal(linha, 1)) = True Then
                            MsgBox "Não insira mais vendas que compras."
                            GoTo fim
                        End If
                        
                        achou = False
                        achouvenda = False
                        
                        For linha2 = linha + 1 To linhaspreenchidas
                            
                            
                            
                            
                            If UCase(tbprincipal(linha, 2)) = UCase(tbprincipal(linha2, 2)) And _
                                UCase(tbprincipal(linha, 1)) = UCase(tbprincipal(linha2, 1)) Then
                                If UCase(colunaB(linha)) <> "B" Then
                                    If tbprincipal(linha, 3) <> "" Then
                                        If tbprincipal(linha, 4) <> "" Then
                                            
                                            achou = True
                                            corretora = tbprincipal(linha, 2)
                                            ativo = tbprincipal(linha, 1)
                                            
                                            For linha7 = 3 To linhaspreenchidas - 1
                                                If tbprincipal(linha7, 3) < 0 Then
                                                    achouvenda = True
                                                    Exit For
                                                End If
                                            Next linha7
                                            If achouvenda = False Then
                                                Call preenchertabelaauxiliar(corretora, ativo)
                                            Else
                                                Call preenchertabelaauxiliar2(corretora, ativo)
                                            End If
                                            ' Exit For
                                        End If
                                    End If
                                End If
                            End If
                            
                        Next linha2
                        
                        If achou = False Then
                            If UCase(colunaB(linha)) <> "B" Then
                                If tbprincipal(linha, 3) > 0 Then
                                    
                                    Sheets(NomePlan).Range("AC" & linha).Value = tbprincipal(linha, 4)
                                    tbprincipal(linha, 5) = tbprincipal(linha, 4)
                                    colunaB(linha) = "B"
                                Else
                                    
                                    
                                    
                                End If
                            End If
                        End If
                    End If
                End If
            End If
        Else
            Call preenchertabelaauxiliar(tbprincipal(3, 2), tbprincipal(3, 1))
            
        End If
        
        linha = linha + 1
    Wend
    
fim:
    '    Application.EnableEvents = True
End Sub


Sub preenchertabelaauxiliar(ByVal corretora As String, ByVal ativo As String)
    'Dim colunaB(1000000) As String
    
    On Error GoTo fim
    Dim linha As Long
    Dim linha2 As Long
    Dim precomedio As Double
    Dim achou As Boolean
    Dim linha3 As Long
    Dim linha4 As Long
    '  Dim linhaspreenchidas As Long
    Dim qtdvendas As Double
    Dim qtdgeralvendas As Double
    
    Dim QTD As Double
    Dim PRECO As Double
    Dim TOTAL As Double
    Dim QTDGERAL As Double
    Dim TOTALGERAL As Double
    achou = False
    ' linhaspreenchidas = 3
    linha3 = 3
    linha4 = 3
    '    While tbprincipal(linhaspreenchidas, 2) <> ""
    '
    '        linhaspreenchidas = linhaspreenchidas + 1
    '    Wend
    linha = 3
    ' Dim tbprincipal(1000000, 5) As Variant
    
    Dim tbAuxiliar(1000000, 5) As Variant
    While tbprincipal(linha, 2) <> ""
        
        
        For linha2 = linha + 1 To linhaspreenchidas
            If UCase(tbprincipal(linha, 2)) = UCase(corretora) And _
                UCase(tbprincipal(linha, 1)) = UCase(ativo) Then
                If UCase(colunaB(linha)) <> "B" Then
                    If tbprincipal(linha, 3) > 0 Then
                        tbAuxiliar(linha3, 0) = tbprincipal(linha, 2)
                        tbAuxiliar(linha3, 1) = tbprincipal(linha, 1)
                        tbAuxiliar(linha3, 2) = tbprincipal(linha, 3)
                        tbAuxiliar(linha3, 3) = tbprincipal(linha, 4)
                        linha3 = linha3 + 1
                        
                        
                        colunaB(linha) = "B"
                        
                    End If
                End If
            End If
            
            
        Next linha2
        linha = linha + 1
    Wend
    
    linha3 = 3
    QTD = 0
    PRECO = 0
    While tbAuxiliar(linha3, 0) <> ""
        
        QTD = tbAuxiliar(linha3, 2)
        PRECO = tbAuxiliar(linha3, 3)
        TOTAL = QTD * PRECO
        tbAuxiliar(linha3, 4) = TOTAL
        linha3 = linha3 + 1
    Wend
    
    linha3 = 3
    
    TOTALGERAL = 0
    QTDGERAL = 0
    While tbAuxiliar(linha3, 0) <> ""
        
        QTD = tbAuxiliar(linha3, 2)
        
        TOTAL = tbAuxiliar(linha3, 4)
        TOTALGERAL = TOTALGERAL + TOTAL
        QTDGERAL = QTDGERAL + QTD
        
        
        
        linha3 = linha3 + 1
    Wend
    
    precomedio = TOTALGERAL / QTDGERAL
    
    linha = 3
    linha3 = 3
    
    While tbprincipal(linha, 2) <> ""
        
        
        If UCase(tbprincipal(linha, 2)) = UCase(corretora) And _
            UCase(tbprincipal(linha, 1)) = UCase(ativo) Then
            If tbprincipal(linha, 3) > 0 Then
                ' If tbprincipal(linha, 3) > 0 Then
                
                colunaB(linha) = "B"
                Sheets(NomePlan).Range("AC" & linha) = precomedio
                
                'End If
            End If
        End If
        
        linha = linha + 1
    Wend
    
fim:
    
End Sub



Sub preenchertabelaauxiliar2(ByVal corretora As String, ByVal ativo As String)
    On Error GoTo fim
    Dim achouvenda(1000000) As Variant
    ' Dim colunaB(1000000) As String
    
    
    Dim LINHA20 As Long
    Dim linha As Long
    Dim linha2 As Long
    Dim precomedio As Double
    Dim achou As Boolean
    Dim QTD As Double
    Dim PRECO As Double
    Dim TOTAL As Double
    Dim qtd2 As Double
    Dim preco2 As Double
    Dim total2 As Double
    Dim QTDGERAL2 As Double
    Dim TOTALGERAL2 As Double
    Dim linha5 As Long
    Dim linha3 As Long
    Dim linha4 As Long
    Dim LININICIAL As Long
    Dim LINFINAL As Long
    Dim LINHA9 As Long
    'Dim linhaspreenchidas As Long
    Dim precomedio2 As Double
    'Dim tbprincipal2(1000000, 6) As Variant
    
    'Dim tbprincipal(3 To 1000000, 5) As Variant
    
    
    
    achou = False
    'linhaspreenchidas = 3
    linha3 = 3
    linha4 = 3
    '    While tbprincipal(linhaspreenchidas, 2) <> ""
    '
    '        linhaspreenchidas = linhaspreenchidas + 1
    '    Wend
    linha = 3
    
    
    
    linha3 = 3
    QTD = 0
    PRECO = 0
    While tbprincipal(linha3, 1) <> ""
        If tbprincipal(linha3, 0) <> "ZERADA" Then
            
            If UCase(tbprincipal(linha3, 2)) = UCase(corretora) And _
                UCase(tbprincipal(linha3, 1)) = UCase(ativo) Then
                QTD = tbprincipal(linha3, 3)
                If QTD > 0 Then
                    PRECO = tbprincipal(linha3, 4)
                Else
                    LINFINAL = linha3 - 1
                    For LINHA9 = LINFINAL To 3 Step -1
                        If tbprincipal(LINHA9, 3) > 0 Then
                            If tbprincipal(LINHA9, 0) <> "ZERADA" Then
                                If UCase(tbprincipal(LINHA9, 2)) = UCase(corretora) And _
                                    UCase(tbprincipal(LINHA9, 1)) = UCase(ativo) Then
                                    LININICIAL = LINHA9
                                End If
                            End If
                        End If
                        
                    Next LINHA9
                    PRECO = PRECODEVENDA(LININICIAL, LINFINAL, corretora, ativo)
                    
                End If
                TOTAL = QTD * PRECO
                tbprincipal(linha3, 6) = TOTAL
            End If
        End If
        linha3 = linha3 + 1
    Wend
    
    linha3 = 3
    Dim QTDGERAL As Double
    Dim TOTALGERAL As Double
    TOTALGERAL = 0
    QTDGERAL = 0
    While tbprincipal(linha3, 1) <> ""
        If tbprincipal(linha3, 0) <> "ZERADA" Then
            
            If UCase(tbprincipal(linha3, 2)) = UCase(corretora) And _
                UCase(tbprincipal(linha3, 1)) = UCase(ativo) Then
                QTD = tbprincipal(linha3, 3)
                
                TOTAL = tbprincipal(linha3, 6)
                TOTALGERAL = TOTALGERAL + TOTAL
                QTDGERAL = QTDGERAL + QTD
                
            End If
        End If
        
        linha3 = linha3 + 1
    Wend
    
    If QTDGERAL = 0 Then
        Dim j As Long
        Dim LINHA8 As Long
        
        
        
        linha2 = linhaspreenchidas - 1
        If tbprincipal(linha2, 3) < 0 Then
            'If tbprincipal(linha2, 0) = "ZERADA" Then
            ' If tbprincipal(linha2, 3) < 0 Then
            If Sheets(NomePlan).Range("AC" & linha2).Value = "" Then
                
                
                
                
                LINFINAL = linha2 - 1
                For LINHA9 = LINFINAL To 3 Step -1
                    If tbprincipal(LINHA9, 3) > 0 Then
                        'If tbprincipal(LINHA9, 0) <> "ZERADA" Then
                        If UCase(tbprincipal(LINHA9, 2)) = UCase(corretora) And _
                            UCase(tbprincipal(LINHA9, 1)) = UCase(ativo) Then
                            LININICIAL = LINHA9
                            'End If
                        End If
                    End If
                    
                Next LINHA9
                PRECO = PRECODEVENDA(LININICIAL, LINFINAL, corretora, ativo)
                
                
                Sheets(NomePlan).Range("AC" & linha2).Value = PRECO
                tbprincipal(linha2, 5) = PRECO
                colunaB(linha2) = "B"
            End If
        End If

    
    
    
    For LINHA8 = linha3 - 1 To 3 Step -1
        If tbprincipal(LINHA8, 0) <> "ZERADA" Then
            
            If tbprincipal(LINHA8, 2) = corretora And _
                tbprincipal(LINHA8, 1) = ativo Then
                If tbprincipal(4, 3) <> "" Then
                    Sheets(NomePlan).Range("B" & LINHA8).Value = "ZERADA"
                    tbprincipal(LINHA8, 0) = "ZERADA"
                    
                End If
            End If
        End If
        
        
    Next LINHA8
    
    For j = linha3 - 1 To 3 Step -1
        
        If tbprincipal(j, 1) = ativo Then
            
            If tbprincipal(j, 0) = corretora Then
                Exit For
                
            End If
            
        End If
        
    Next j
    precomedio = tbprincipal(j, 5)
Else
    precomedio = TOTALGERAL / QTDGERAL
    
    linha = 3
    
    
    While tbprincipal(linha, 2) <> ""
        If tbprincipal(linha3, 0) <> "ZERADA" Then
            
            
            If UCase(tbprincipal(linha, 2)) = UCase(corretora) And _
                UCase(tbprincipal(linha, 1)) = UCase(ativo) Then
                'If tbprincipal(linha, 3) > 0 Then
                If tbprincipal(linha, 0) <> "ZERADA" Then
                    If colunaB(linha) <> "B" Then
                        colunaB(linha) = "B"
                        Sheets(NomePlan).Range("AC" & linha).Value = precomedio
                    End If
                End If
            End If
        End If
        'End If
        linha = linha + 1
        
    Wend
End If


fim:

End Sub

Public Function VerificarQuantidade(ByVal corretora As String, ByVal ativo As String) As Boolean
    
    Dim contqtdpositiva As Double
    Dim contqtdnegativa As Double
    'Dim linhaspreenchidas As Long
    Dim linha As Long
    Dim linha2 As Long
    '  Dim corretora As String
    'Dim ativo As String
    Dim linha3 As Long
    Dim tbprincipal(1000000, 5) As Variant
    Dim ColunaC(1000000) As Variant
    
    Dim linha5 As Long
    Dim qtd2 As Double
    '    linhaspreenchidas = 3
    '    While tbprincipal(linhaspreenchidas, 2) <> ""
    '
    '        linhaspreenchidas = linhaspreenchidas + 1
    '    Wend
    linha3 = 3
    linha = 3
    While tbprincipal(linha, 2) <> ""
        
        
        For linha2 = linha + 1 To linhaspreenchidas
            If tbprincipal(linha, 0) = "ZERADA" Then
                Exit For
            End If
            If UCase(tbprincipal(linha, 2)) = UCase(corretora) And _
                UCase(tbprincipal(linha, 1)) = UCase(ativo) Then
                If UCase(ColunaC(linha)) = "B" Then
                    Exit For
                End If
                If UCase(ColunaC(linha)) <> "B" Then
                    If tbprincipal(linha, 0) <> "ZERADA" Then
                        
                        tbprincipal(linha3, 0) = tbprincipal(linha, 2)
                        tbprincipal(linha3, 1) = tbprincipal(linha, 1)
                        tbprincipal(linha3, 2) = tbprincipal(linha, 3)
                        tbprincipal(linha3, 3) = tbprincipal(linha, 4)
                        linha3 = linha3 + 1
                        ColunaC(linha) = "B"
                    End If
                End If
            End If
            
        Next linha2
        linha = linha + 1
    Wend
    
    contqtdpositiva = 0
    contqtdnegativa = 0
    linha5 = 3
    qtd2 = 0
    'preco2 = 0
    While tbprincipal(linha5, 1) <> ""
        
        
        qtd2 = tbprincipal(linha5, 2)
        If qtd2 > 0 Then
            contqtdpositiva = contqtdpositiva + qtd2
        Else
            contqtdnegativa = contqtdnegativa - qtd2
            
        End If
        
        
        linha5 = linha5 + 1
        
    Wend
    
    If contqtdnegativa > contqtdpositiva Then
        
        VerificarQuantidade = True
        
        
    End If
    
End Function





Function PRECODEVENDA(ByVal LINHAINICIAL As Long, ByVal LINHAFINAL As Long, ByVal corretora As String, ByVal ativo As String) As Double
    On Error GoTo fim
    Dim linha As Long
    Dim linha2 As Long
    Dim precomedio As Double
    Dim achou As Boolean
    Dim linha3 As Long
    Dim linha4 As Long
    ' Dim linhaspreenchidas As Long
    Dim qtdvendas As Double
    Dim qtdgeralvendas As Double
    
    Dim QTD As Double
    Dim PRECO As Double
    Dim TOTAL As Double
    Dim QTDGERAL As Double
    Dim TOTALGERAL As Double
    achou = False
    ' linhaspreenchidas = 3
    linha3 = 3
    linha4 = 3
    
    linha = 3
    ' Dim tbprincipal(1000000, 5) As Variant
    
    Dim tbAuxiliar(3 To 1000000, 5) As Variant
    'While tbprincipal(linha, 2) <> ""
    
    
    For linha2 = LINHAINICIAL To LINHAFINAL
        If UCase(tbprincipal(linha2, 2)) = UCase(corretora) And _
            UCase(tbprincipal(linha2, 1)) = UCase(ativo) Then
            If tbprincipal(linha2, 3) > 0 Then
                If tbprincipal(linha2, 0) <> "ZERADA" Then
                    
                    tbAuxiliar(linha3, 0) = tbprincipal(linha2, 2)
                    tbAuxiliar(linha3, 1) = tbprincipal(linha2, 1)
                    tbAuxiliar(linha3, 2) = tbprincipal(linha2, 3)
                    tbAuxiliar(linha3, 3) = tbprincipal(linha2, 4)
                    linha3 = linha3 + 1
                    
                End If
            End If
            
        End If
        
        
    Next linha2
    '  linha = linha + 1
    ' Wend
    
    linha3 = 3
    QTD = 0
    PRECO = 0
    While tbAuxiliar(linha3, 0) <> ""
        
        QTD = tbAuxiliar(linha3, 2)
        PRECO = tbAuxiliar(linha3, 3)
        TOTAL = QTD * PRECO
        tbAuxiliar(linha3, 4) = TOTAL
        linha3 = linha3 + 1
    Wend
    
    linha3 = 3
    
    TOTALGERAL = 0
    QTDGERAL = 0
    While tbAuxiliar(linha3, 0) <> ""
        
        QTD = tbAuxiliar(linha3, 2)
        
        TOTAL = tbAuxiliar(linha3, 4)
        TOTALGERAL = TOTALGERAL + TOTAL
        QTDGERAL = QTDGERAL + QTD
        
        
        
        linha3 = linha3 + 1
    Wend
    
    precomedio = TOTALGERAL / QTDGERAL
    PRECODEVENDA = precomedio
fim:
End Function

 
Postado : 06/05/2018 2:59 pm
(@edcronos2)
Posts: 346
Reputable Member
 

só como referencia
NÃO SEI SE OS CÁLCULOS ESTÃO CORRETOS PQ NÃO ENTENDI MUITO BEM O LANCE DE VENDA DE ATIVOS
existem varios pontos a se comentar sobre a planilha , mas...

colunas e TITULOS
F = Ativo
G = corretora
H = Qtde
i = Preço Compra / Vend
J = Preço Médio Ponderado "A MACRO NÃO TRABALHA NELA"

tabela de saida RESULTADO unico por ativo e corretora como referencia, é montado em um array
colunas e TITULOS:
M = Ativo
N = Corretora
O = Qtde
P =Valor Acumulado
Q = "Preço Médio Ponderado"
R = Resta


Sub ativos()
     Dim exc(1 To 250, 1 To 6)
     arr = Range("F3:i" & Cells(Rows.Count, "f").End(xlUp).Row).Value2
     For c = 1 To 3
          exc(1, c) = arr(1, c)
     Next
     exc(1, 4) = exc(1, 4) + (arr(1, 4) * arr(1, 3))
     exc(1, 6) = exc(1, 3)
     l2 = 1

     For l = 2 To UBound(arr, 1)
          For l3 = 1 To l2 Step 2
               If arr(l, 1) & arr(l, 2) = exc(l3, 1) & exc(l3, 2) Then
                    If arr(l, 3) > 0 Then
                         exc(l3, 3) = exc(l3, 3) + arr(l, 3)
                         exc(l3, 6) = exc(l3, 6) + arr(l, 3)
                         exc(l3, 4) = exc(l3, 4) + (arr(l, 4) * arr(l, 3))
                    Else
                    
                         If exc(l3, 6) < -arr(l, 3) Then
                              MsgBox "venda excede quantidade existente "
                              GoTo fim
                         End If
                         exc(l3 + 1, 3) = exc(l3 + 1, 3) + arr(l, 3)
                         exc(l3, 6) = exc(l3, 6) + arr(l, 3)
                         exc(l3 + 1, 5) = exc(l3, 4) / exc(l3, 3)
                    End If
                    GoTo tem
               End If
          Next

          l2 = l2 + 2
          For c = 1 To 3
               exc(l2, c) = arr(l, c)
          Next
          exc(l2, 4) = exc(l2, 4) + (arr(l, 4) * arr(l, 3))
          exc(l2, 6) = exc(l2, 3)
tem:
     Next
fim:
     For l3 = 1 To l2 Step 2
          exc(l3, 5) = exc(l3, 4) / exc(l3, 3)
     Next

     Range(Cells(3, 13), Cells(UBound(exc, 1) + 2, UBound(exc, 2) + 12)).Value2 = exc

End Sub
 
Postado : 07/05/2018 8:34 am
(@edcronos2)
Posts: 346
Reputable Member
 

bem, pelo viso o assunto morreu,
eu ia pelo menos ajustar a macro para ter os cálculos corretos, mas pelo visto não fui bem vindo aqui

Sub ativos()
     Dim exc(1 To 250, 1 To 6)
     arr = Range("F3:j" & Cells(Rows.Count, "f").End(xlUp).Row).Value2
     For c = 1 To 3
          exc(1, c) = arr(1, c)
     Next
     exc(1, 4) = exc(1, 4) + (arr(1, 4) * arr(1, 3))
     exc(1, 6) = exc(1, 3)
     l2 = 1

     For l = 2 To UBound(arr, 1)
          For l3 = 1 To l2 Step 2
               If arr(l, 1) & arr(l, 2) = exc(l3, 1) & exc(l3, 2) Then
                    If arr(l, 3) > 0 Then
                         exc(l3, 3) = exc(l3, 3) + arr(l, 3)
                         exc(l3, 6) = exc(l3, 6) + arr(l, 3)
                         exc(l3, 4) = exc(l3, 4) + (arr(l, 4) * arr(l, 3))
                    Else
                    
                         If exc(l3, 6) < -arr(l, 3) Then
                              MsgBox "venda excede quantidade existente "
                              GoTo fim
                         End If
                         exc(l3 + 1, 3) = exc(l3 + 1, 3) + arr(l, 3)
                         exc(l3, 6) = exc(l3, 6) + arr(l, 3)
                         exc(l3 + 1, 5) = exc(l3, 4) / exc(l3, 3)
                         arr(l, 5) = exc(l3 + 1, 5)
                    End If
                    GoTo tem
               End If
          Next

          l2 = l2 + 2
          For c = 1 To 3
               exc(l2, c) = arr(l, c)
          Next
          exc(l2, 4) = exc(l2, 4) + (arr(l, 4) * arr(l, 3))
          exc(l2, 6) = exc(l2, 3)
tem:
     Next
fim:
     For l3 = 1 To l2 Step 2
          exc(l3, 5) = exc(l3, 4) / exc(l3, 3)
     Next

     Range(Cells(3, 13), Cells(UBound(exc, 1) + 2, UBound(exc, 2) + 12)).Value2 = exc
Range("F3:j" & Cells(Rows.Count, "f").End(xlUp).Row).Value2 = arr
End Sub
 
Postado : 07/05/2018 12:36 pm
(@luis-p)
Posts: 16
Active Member
Topic starter
 

edcronos2. Boa noite!
Primeiramente todos os colegas cuja a intenção é de ajudar é sempre bem vindo.
Por motivo de saúde, estive ausente do fórum e não pude visualizar os seus posts. Inclusive, acabei de responder o colega wagner em outro tópico, o qual também ficou sem resposta durante este período.

Como foi dito anteriormente, a última versão disponibilizada pelo klarc28 está funcionando, porém é está bastante lenta.

COLUNAS e TITULOS
F = Ativo
T = corretora
U = Qtde
AB = Preço Compra / Vend
AC = Preço Médio Ponderado "A MACRO TRÁS O RESULTADO NELA"

O klarc28 criou uma condição na coluna B que mostra a palavra "ZERADA", todas as vezes que a soma dos ativos (compra = venda) ocorre. Entretanto, não preciso dessa coluna. Talvez seja ela que prejudicou a performance da planilha, pois nas versões anteriores o código rodava sem travamentos.

Se o klarc28 puder comentar, seria melhor, pois é algo técnico que não sei explicar.

Abraço,

Luís

 
Postado : 14/05/2018 4:05 pm
(@luis-p)
Posts: 16
Active Member
Topic starter
 

Klarc28,
Conforme conversamos, a código está funcionando corretamente.
Agradeço mais uma vez o grande trabalho que você realizou neste código.
Muito obrigado.
Att
Luís

 
Postado : 22/05/2018 6:44 pm