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.
#32417
Meus Caros,

Boa noite.
Esta é a primeira vez que posto aqui no Guru do Excel.

Estou recorrendo ao fórum para tentar resolver um código VBA aqui.

Por favor, poderiam dar uma olhada?

Explicando: Segue anexo 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 eu 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:

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 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.

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.

Estou há dias tentando resolver isso.
Espero que possam me ajudar e desde já eu agraço imensamente!
Você não está autorizado a ver ou baixar esse anexo.
#32437
Se a sua tabela ainda necessita da substituição das fórmulas pelos seus respectivos valores conforme o critério, então rode o código abaixo.
Para rodar o código (que deverá ser instalado em um módulo comum) ~~~> com a planilha "Saldos" ativa aperte Alt+F8 / selecione SubstituiFórmulaPorSeuValor / Executar
Código: Selecionar todos
Sub SubstituiFórmulaPorSeuValor()
 Dim LR As Long, c As Range
  Application.ScreenUpdating = False
  ActiveSheet.AutoFilterMode = False
  LR = Cells(Rows.Count, "F").End(3).Row
  ActiveSheet.Range("B2:O" & LR).AutoFilter Field:=5, Criteria1:="=Compra", Operator:=xlOr, Criteria2:="=Venda"
   For Each c In Range("F3:F" & LR).SpecialCells(xlCellTypeVisible)
    c.Offset(1, 9).Value = c.Offset(1, 9).Value
   Next c
  ActiveSheet.AutoFilterMode = False
  ActiveSheet.[B2].AutoFilter
  Application.ScreenUpdating = True
End Sub
Daí em diante ao inserir os termos "Compra" ou "Venda" via teclado/mouse na coluna F, o código abaixo (que deverá ser instalado no módulo da planilha "Saldos") irá fazer a substituição da fórmula pelo seu valor conforme o critério.
Código: Selecionar todos
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Count > 1 Then Exit Sub
 If Target.Column <> 6 Or (Target.Value <> "Compra" And Target.Value <> "Venda") Then Exit Sub
 Target.Offset(1, 9).Value = Target.Offset(1, 9).Value
End Sub
obs. antes de testar os códigos acima remova os códigos existentes no seu arquivo.
#32509
AlexandreJos, marque o tópico como resolvido.
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