executar automaticamente uma macro Excel em uma mudança de célula
-
03-07-2019 - |
Pergunta
Como posso executar automaticamente uma macro Excel cada vez que um valor em uma mudança específica de células?
Agora, o meu código de trabalho é:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub
onde "H5"
é a célula particular que está sendo monitorado e Macro
é o nome da macro.
Existe uma maneira melhor?
Solução
Seu código parece muito bom.
Tenha cuidado, no entanto, para a sua chamada para Range("H5")
é um comando de atalho para Application.Range("H5")
, o que equivale a Application.ActiveSheet.Range("H5")
. Isso poderia ser bom, se as únicas mudanças são user-mudanças - que é o mais típico - mas é possível que os valores das células da planilha para a mudança quando não é a planilha ativa através de mudanças programáticas, por exemplo, VBA.
Com isto em mente, eu iria utilizar Target.Worksheet.Range("H5")
:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then Macro
End Sub
Ou você pode usar Me.Range("H5")
, se o manipulador de eventos está na página de código para a planilha em questão (normalmente é):
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
End Sub
Espero que isso ajude ...
Outras dicas
Manipular o evento Worksheet_Change
ou o evento Workbook_SheetChange
.
Os manipuladores de eventos recebem um argumento "Target As Range", para que possa verificar se o intervalo que está mudando inclui a célula que você está interessado.
Eu prefiro desta forma, não usando um celular, mas uma gama
Dim cell_to_test As Range, cells_changed As Range
Set cells_changed = Target(1, 1)
Set cell_to_test = Range( RANGE_OF_CELLS_TO_DETECT )
If Not Intersect(cells_changed, cell_to_test) Is Nothing Then
Macro
End If
Eu passei muito tempo pesquisando isso e aprender como tudo funciona, depois de realmente estragar os gatilhos de eventos. Uma vez que não foi muito espalhadas informação que eu decidi compartilhar o que eu encontrei para trabalhar em um só lugar, passo a passo como segue:
1) Abra o VBA Editor, no âmbito do Projecto VBA (YourWorkBookName.xlsm) aberta de objetos do Microsoft Excel e selecione a folha à qual o evento de alteração irá pertencer.
2) A visualização de código padrão é "Geral". A partir da lista drop-down na parte superior central, selecione "Planilha".
3) Private Sub Worksheet_SelectionChange já está lá como deveria ser, deixá-lo sozinho. Copiar / colar o código do Mike Rosenblum de cima e alterar a referência .Range para a célula para a qual você está assistindo para uma mudança (B3, no meu caso). Não coloque o seu ainda Macro, no entanto (I removido a palavra "Macro" depois "Então"):
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub
ou a partir da lista drop-down na parte superior esquerda, selecione "Alterar" e no espaço entre Private Sub e End Sub, cole If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
4) Na linha após "Então" desligar os eventos de modo que quando você ligar o seu macro, não eventos de disparo e tentar executar este Worksheet_Change novamente em um ciclo interminável que trava Excel e / ou de outra forma mexe tudo para cima :
Application.EnableEvents = False
5) Ligue para o seu macro
Call YourMacroName
6) Gire eventos novamente para que a próxima mudança (e qualquer / todos os outros eventos) gatilho:
Application.EnableEvents = True
7) End If bloco eo Sub:
End If
End Sub
O código inteiro:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("B3")) Is Nothing Then
Application.EnableEvents = False
Call UpdateAndViewOnly
Application.EnableEvents = True
End If
End Sub
Isso leva transformando eventos on / off para fora dos módulos que cria problemas e simplesmente deixa o gatilho mudança, desliga eventos, corre suas macro e transforma eventos novamente.
Eu tenho uma célula que está ligado ao banco de dados de estoque on-line e atualizado com freqüência. Eu quero provocar uma macro sempre que o valor da célula é atualizado.
Eu acredito que esta é semelhante à mudança de valor da célula por um programa ou qualquer atualização de dados externos, mas acima de exemplos de alguma forma não trabalho para mim. Eu acho que o problema é porque os eventos internos do Excel não são acionados, mas isso é o meu palpite.
Eu fiz o seguinte,
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheets("Symbols").Range("$C$3")) Is Nothing Then
'Run Macro
End Sub