Ir ao conteúdo
  • Cadastre-se

Excel Macro Elimina Fórmula Sob condição e Deixa resultado


Posts recomendados

Olá Pessoal,

 

Boa tarde a todos.

Por favor, vejam se podem me ajudar com este código. 

 

Segue anexo uma planilha de lançamentos. Abaixo de cada linha lançada há uma outra linha com fórmulas que são acionadas sempre que o lançamento (na coluna F) for "Compra" ou "Venda". A saber, sempre que se lança uma Compra a linha de baixo calcula o Débito. Sempre que se lança uma Venda a linha de baixo calcula o Crédito. Simples assim.

 

O eu que preciso: toda vez que a "linha de baixo" do lançamento for acionada, isto é, que o lançamento (na coluna F) for "Compra" ou "Venda", que o resultado da linha de abaixo, EXATAMENTE NA COLUNA O, elimine a fórmula e mantenha o resultado da fórmula. Isso deve ocorrer organicamente, isto é, disparar o VBA por botão e sim quando determinado evento ocorre na planilha, em nosso caso, o lançamento (na coluna F) de "Compra" ou "Venda".

 

OBS: A planilha anexa já traz uma sequência de lançamentos, mas observe que novas linhas serão lançadas, logo, a solução deve considerar isso. 

 

O eu que já fiz: Infelizmente não entendo nada de macros e VBA, mas tentei, sem sucesso, adequar um código VBA para solucionar o problema. Segue abaixo o que fiz:

 

- RODAR MACRO QUANDO O CONTEÚDO DA CÉLULA É ALTERADO (VIA FÓRMULA OU MANUALMENTE)

 Abri o editor VBA (Alt + F11) e na aba Plan1(Saldos) digitei o seguinte código:
 

  Private Sub Worksheet_Calculate()
     If Plan1(Saldos).Range("O24").Value <> PrevVal Then
     Call Macro1_EliminaFormula_DeixaResultado
     PrevVal = Plan1(Saldos).Range("O24").Value
     End If
    End Sub

 

Porém, segundo a fonte da web onde eu peguei o código, diz que para o código funcionar corretamente outras duas etapas devem ser feitas. No menu à esquerda onde diz EstaPasta_de_trabalho fui orientado a inserir outro código (ele já segue com minhas adaptações):

 

   Private Sub Workbook_Open()
     PrevVal = Plan1(Saldos).Range("O24").Value
    End Sub

 

O objetivo do código acima é garantir que no momento em que o arquivo for aberto, a variável verifique e guarde as células da coluna O, imediatamente abaixo linha lançada, assim, quando ela for alterada o código conseguirá fazer a comparação e detectar a mudança.

 

Por fim, a segunda e última etapa sugerida pela fonte da web é criar a variável PrevVal que fará todo este controle. Para tanto, eu deveria criar um módulo (ou utilizar um já existente) e inserir o seguinte código. Fiz assim:

 

    Public PrevVal As Variant

 

Bem, como eu disse anteriormente, o código VBA acima não funcionou. Por favor, alguém pode me ajudar a chegar no resultado desejado?

Desde já agradeço!

 

Macro para eliminar fórmula e deixar resultado.rar

Link para o comentário
Compartilhar em outros sites

Pessoal, eu acredito que tudo pode ficar mais simples se eu conseguir chamar uma macro a partir de uma fórmula. 

Exemplo:

 

=SE(OU(F23="Compra";F23="Venda");E(O23*K23;MINHAFUNC);"")

*MINHAFUNC = o nome da Macro que criei.

 

Se alguém puder me ajudar, eu agradeço.

 

Link para o comentário
Compartilhar em outros sites

Depois de horas de tentativas e erros eu consegui um resultado parcial.

 

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
    If Range("F25").Value = "Compra" Or Range("F25").Value = "Venda" Then
        Range("O26").Select
        'Chama Macro1_EliminaFormula_DeixaResultado()
        Call Macro1_EliminaFormula_DeixaResultado
    
    End If
Application.EnableEvents = True
End Sub
 

Agora preciso de ajuda para que a CONDIÇÃO da célula F se estenda sobre a coluna F e o RESULTADO esperado se estenda sobre a coluna O.

 

Sendo mais específico, não é sobre TODA a coluna F ou TODA a coluna O.

A condição aplica-se na coluna F da linha lançada e o resultado aplica-se na coluna O, abaixo da linha lançada. Veja o abaixo:

 

Exemplo:

 

                                     A    B    C    D   E    F    G    H    I    J    K    L    M    N    O

Linha lançada ----------------------------------> (1)

Linha gerada pela condição* --------------------------------------------------------------> (2)

 

                                     A    B    C    D   E    F    G    H    I    J    K    L    M    N    O

Linha lançada ----------------------------------> (1)

Linha gerada pela condição* --------------------------------------------------------------> (2)

 

(1) Lugar da coluna F que ao se lançar a "Compra" ou "Venda" aciona as fórmulas geram a linha de baixo.

 

(2) Lugar da coluna O (abaixo da linha lançada) em que o código VBA se aplica, eliminando a fórmula e deixando o resultado.

 

* Os dados da linha gerada aparecem quando as as fórmulas da planilha atendem a condição da linha lançada. Toda vez que no lançamento da coluna F aparece "Compra" ou "Venda", a condição é acionada e a linha abaixo apresenta seus dados.

 

Esta sequência vai se repetindo ao longo da planilha.

Alguém pode dar uma força, por favor?

 

Link para o comentário
Compartilhar em outros sites

Caro @Patropi,

 

Boa noite.

Estou recorrendo a você para tentar resolver um código VBA aqui. 

Por favor, poderia dar uma olhada?

 

Explicando: Segue anexo (no primeiro post) uma planilha de lançamentos. A cada linha lançada, a coluna F pode conter, entre outras, as palavras "Compra" ou "Venda". Toda vez que aparecer "Compra" ou "Venda" na coluna F, as fórmulas da planilha preenchem a linha imediatamente abaixo da linha lançada, que aqui chamo de linha gerada. Até aqui tudo funciona.

 

Na linha gerada, na coluna O, tem uma fórmula que resulta em um número. Exatamente neste ponto, eu preciso que a fórmula deixe de existir e permaneça apenas o resultado da fórmula. Depois de horas de tentativas e erros eu consegui um resultado parcial com este código:

 

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
    If Range("F25").Value = "Compra" Or Range("F25").Value = "Venda" Then
        Range("O26").Select
        'Chama Macro1_EliminaFormula_DeixaResultado()
        Call Macro1_EliminaFormula_DeixaResultado
    
    End If
Application.EnableEvents = True
End Sub

 

O que fiz até aqui foi um código que chama uma macro e transforma uma formula em seu resultado. Agora eu preciso que a cada linha lançada, isto seja verificado. Assim:

 

- A cada linha lançada o código verifique se na coluna F existe as palavras "Compra" ou "Venda". Em caso positivo, o código precisa ir até a coluna O, imediatamente abaixo da linha lançada, e executar a macro contida no código acima (que transforma uma formula em seu resultado).

 

A inteligência esperada aqui é justamente reconhecer, a cada linha lançada, os lançamentos de "Compra" ou "Venda" na coluna F e que estes dois lançamentos representem a condição para executar a macro na coluna O da linha gerada. Isso deve resolver o problema. 

 

Como pode ver pelo histórico dos posts eu estou há dias tentando resolver isso. 

Espero que possa me ajudar e desde já eu lhe agraço imensamente!

 

 

Link para o comentário
Compartilhar em outros sites

Caro @Patropi,

 

Boa noite.

Estou recorrendo a você para tentar resolver um código VBA aqui. 

Por favor, poderia dar uma olhada?

 

Explicando: Segue anexo (no primeiro post) uma planilha de lançamentos. A cada linha lançada, a coluna F pode conter, entre outras, as palavras "Compra" ou "Venda". Toda vez que aparecer "Compra" ou "Venda" na coluna F, as fórmulas da planilha preenchem a linha imediatamente abaixo da linha lançada, que aqui chamo de linha gerada. Até aqui tudo funciona.

 

Na linha gerada, na coluna O, tem uma fórmula que resulta em um número. Exatamente neste ponto, eu preciso que a fórmula deixe de existir e permaneça apenas o resultado da fórmula. Depois de horas de tentativas e erros eu consegui um resultado parcial com este código:

 

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
    If Range("F25").Value = "Compra" Or Range("F25").Value = "Venda" Then
        Range("O26").Select
        'Chama Macro1_EliminaFormula_DeixaResultado()
        Call Macro1_EliminaFormula_DeixaResultado
    
    End If
Application.EnableEvents = True
End Sub

 

O que fiz até aqui foi um código que chama uma macro e transforma uma formula em seu resultado. Agora eu preciso que a cada linha lançada, isto seja verificado. Assim:

 

- A cada linha lançada o código verifique se na coluna F existe as palavras "Compra" ou "Venda". Em caso positivo, o código precisa ir até a coluna O, imediatamente abaixo da linha lançada, e executar a macro contida no código acima (que transforma uma formula em seu resultado).

 

A inteligência esperada aqui é justamente reconhecer, a cada linha lançada, os lançamentos de "Compra" ou "Venda" na coluna F e que estes dois lançamentos representem a condição para executar a macro na coluna O da linha gerada. Isso deve resolver o problema. 

 

Como pode ver pelo histórico dos posts eu estou há dias tentando resolver isso. 

Espero que possa me ajudar e desde já eu lhe agraço imensamente!

*****

Ola!

Boa noite.

Avancei um pouco mais na resolução do problema. Mas ainda não está legal. Segue o que fiz:

 

Sub ProcCompraVenda()

Dim i As Long
Dim LastLine As String

'Localiza a última linha preenchida da planilha na coluna F
'LastLine = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
LastLine = Plan1.Cells(Rows.Count, 6).End(xlUp).Row

'Determina onde inicia-se a localização na coluna F
For i = 3 To LastLine

'Procura por Compra ou Venda na coluna F
If Plan1.Cells(i, 6) = "Compra" Or Plan1.Cells(i, 6) = "Venda" Then

'Seleciona célula que receberá a macro
    Plan1.Cells(i + 1, 17).Select
'Executa a macro que elimina a fórmula de deixa o seu resultado
    Call Macro1_EliminarFormula
            
End If

Next i
End Sub

 

O código acima quando executado de dentro do Editor VBA funciona. Ele percorre a condição por toda a planilha e executa a macro nas células corretas, MAS quando lanço uma nova linha, a macro/código (ainda não sei o que acontece) não é acionada. A condição para a macro ser acionada deveria ser orgânica, transparente para o usuário, sem eu precisar entrar no Editor VBA para disparar a macro.

 

NOTA1: Para não perder as fórmulas da planilha eu repiquei a coluna O na coluna Q e apliquei o código acima na coluna repicada (Q).

 

NOTA2: eu também gostaria de acrescentar uma tarefa a mais no código antes dele executar a macro. Hoje quando existe o lançamento de uma Compra ou Venda na coluna F, a planilha, por fórmula, multiplica, na mesma linha as células O por k (quantidade x Cotação), só depois a planilha chama a execução da macro. Eu gostaria que o código passasse a fazer esta conta antes de chamar a macro e não mais as fórmulas da planilha.

 

Alguém pode ajudar, por favor? 

Obrigado.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...