Ir ao conteúdo

Excel Executar macro quando o conteúdo da célula é alterado por fórmula


Ir à solução Resolvido por AfonsoMira,

Posts recomendados

Postado

Boa noite a todos.

Não entendo muito de VBA então estou precisando muito de uma ajudinha aqui dos feras em Excel!

 

Tenho uma rotina que automatiza o preenchimento de um grupo célula quando uma destas sofrem alguma alteração, neste caso toda vez que a coluna AD30 a partir da linha 10  sofre uma alteração a rotina preenche a coluna correspondente neste caso AE31, com uma (fórmula) caso ela fique vazia esta fórmula é apagada... A rotina funciona bem mais o meu problema é que eu tenho que alterar a célula para ativa-la, preciso de ajuda para adaptar este mesmo código para um “Evento” que possibilite verificar se o conjunto de células da coluna AD foram modificadas por uma fórmula ou filtro avançado. Espero ter explicado de forma clara.

A código que estou usando está abaixo! Conto com a ajuda de vcs.

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim COLUNA As Double
Dim LINHA As Double

COLUNA = Target.Column
LINHA = Target.Row

 

'Se A coluna for igual a 30 ou (AD) e a linha maior ou igual a 10. Então
If COLUNA = 30 And LINHA >= 10 Then
    'Verificar se a cécula do Ôdometro está Vazia
    If Range(Target.Address) = "" Then
    'Limpar a célula (KM RODADO)se a céclula Ôdometro estiver vazia
    Cells(LINHA, 31) = ""
    'SE não estiver vazia e célula (KM RODADO)estiver vazia
    ElseIf Cells(LINHA, 31) = "" Then
    'Adicionar fórmula para calculo de (KM RODADO)
    Cells(LINHA, 31).FormulaArray = "=IFERROR(RC[-1]-INDIRECT(""AD""&LARGE(IF(R10C24:RC[-7]=RC[-7],ROW(R10C24:RC[-7])),2)),""0"")"

        
    End If
  End If

End Sub

 

Planilha:

image.png.52bae4cc98fae7f14e264b648bf134ff.png

 

 

 

Postado

@AfonsoMira Olá,Afonso. Tudo certo!

 

A planilha funciona da seguinte forma, como pode observar no print que anexei ao post, as colunas de V:AD atualizam por meio de um "filtro avançado" ao identificar que a coluna AD foi alterada a rotina preenche a coluna AE com uma fórmula. O meu problema está no "evento" pois para que o código em questão seja acionado deve haver uma alteração na célula... Mais o que preciso na verdade e que o código seja acionado quando o conteúdo for modificado...

 

Desde já agradeço sua interação! Preciso muito desta solução. 

Postado

@Maxfdias Boas veja se com este código consegue. 😀

Private Sub Worksheet_Change(ByVal Target As Range)

Dim ultimaLinha As Long

ultimaLinha = ActiveSheet.Cells(Rows.Count, 30).End(xlUp).Row

Application.EnableEvents = False
Application.ScreenUpdating = False

For i = 10 To ultimaLinha
    'Verificar se a cécula do Ôdometro está Vazia
    If Cells(i, 30) = "" Then
        'Limpar a célula (KM RODADO)se a céclula Ôdometro etiver vazia
        Cells(i, 31) = ""
    Else
        'Adicionar fórmula para calculo de (KM RODADO)
        Cells(i, 31).FormulaArray = "=IFERROR(RC[-1]-INDIRECT(""AD""&LARGE(IF(R10C24:RC[-7]=RC[-7],ROW(R10C24:RC[-7])),2)),""0"")"
    End If
Next i

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub

 

  • Curtir 1
Postado

@AfonsoMira Esta aplicando a formulá muito bem! O único problema e que não está "limpando" quando a coluna AD está vazia! Se puder dar uma olhada nisso para mim.... de qualquer forma me ajudou muito... Sou muito grato! 

Postado

@Maxfdias Ora experimente desta forma:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim ultimaLinha As Long

ultimaLinha = ActiveSheet.Cells(Rows.Count, 29).End(xlUp).Row

Application.EnableEvents = False
Application.ScreenUpdating = False

For i = 10 To ultimaLinha
    'Verificar se a cécula do Ôdometro está Vazia
    If Cells(i, 30) = "" Then
        'Limpar a célula (KM RODADO)se a céclula Ôdometro etiver vazia
        Cells(i, 31) = ""
    Else
        'Adicionar fórmula para calculo de (KM RODADO)
        Cells(i, 31).FormulaArray = "=IFERROR(RC[-1]-INDIRECT(""AD""&LARGE(IF(R10C24:RC[-7]=RC[-7],ROW(R10C24:RC[-7])),2)),""0"")"
    End If
Next i

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub

Caso continue sem funcionar, utilize antes este código:

Private Sub Worksheet_Change(ByVal Target As Range)

Application.EnableEvents = False
Application.ScreenUpdating = False

For i = 10 To 500
    'Verificar se a cécula do Ôdometro está Vazia
    If Cells(i, 30) = "" Then
        'Limpar a célula (KM RODADO)se a céclula Ôdometro etiver vazia
        Cells(i, 31) = ""
    Else
        'Adicionar fórmula para calculo de (KM RODADO)
        Cells(i, 31).FormulaArray = "=IFERROR(RC[-1]-INDIRECT(""AD""&LARGE(IF(R10C24:RC[-7]=RC[-7],ROW(R10C24:RC[-7])),2)),""0"")"
    End If
Next i

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub

 

  • Curtir 1
Postado
1 hora atrás, AfonsoMira disse:

@Maxfdias Ora experimente desta forma:


Private Sub Worksheet_Change(ByVal Target As Range)

Dim ultimaLinha As Long

ultimaLinha = ActiveSheet.Cells(Rows.Count, 29).End(xlUp).Row

Application.EnableEvents = False
Application.ScreenUpdating = False

For i = 10 To ultimaLinha
    'Verificar se a cécula do Ôdometro está Vazia
    If Cells(i, 30) = "" Then
        'Limpar a célula (KM RODADO)se a céclula Ôdometro etiver vazia
        Cells(i, 31) = ""
    Else
        'Adicionar fórmula para calculo de (KM RODADO)
        Cells(i, 31).FormulaArray = "=IFERROR(RC[-1]-INDIRECT(""AD""&LARGE(IF(R10C24:RC[-7]=RC[-7],ROW(R10C24:RC[-7])),2)),""0"")"
    End If
Next i

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub

Caso continue sem funcionar, utilize antes este código:


Private Sub Worksheet_Change(ByVal Target As Range)

Application.EnableEvents = False
Application.ScreenUpdating = False

For i = 10 To 500
    'Verificar se a cécula do Ôdometro está Vazia
    If Cells(i, 30) = "" Then
        'Limpar a célula (KM RODADO)se a céclula Ôdometro etiver vazia
        Cells(i, 31) = ""
    Else
        'Adicionar fórmula para calculo de (KM RODADO)
        Cells(i, 31).FormulaArray = "=IFERROR(RC[-1]-INDIRECT(""AD""&LARGE(IF(R10C24:RC[-7]=RC[-7],ROW(R10C24:RC[-7])),2)),""0"")"
    End If
Next i

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub

 

Afonso, o segundo código que você postou está funcionando mais tem alguma inconsistência, ha momentos em que ele funciona ou seja limpa a célula e algumas vezes em que ele simplesmente não insere a fórmula! 

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!