Como posso executar automaticamente uma macro do Excel sempre que um valor em uma célula específica muda?
No momento, 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 sendo monitorada e Macro
é o nome da macro.
Existe uma maneira melhor?
excel
vba
automation
namin
fonte
fonte
Respostas:
Seu código parece muito bom.
Tenha cuidado, entretanto, pois sua chamada para
Range("H5")
é um comando de atalho paraApplication.Range("H5")
, que é equivalente aApplication.ActiveSheet.Range("H5")
. Isso pode ser bom, se as únicas alterações forem alterações do usuário - que é a mais comum - mas é possível que os valores das células da planilha sejam alterados quando não for a planilha ativa por meio de alterações programáticas, por exemplo, VBA.Com isso em mente, eu utilizaria
Target.Worksheet.Range("H5")
:Ou você pode usar
Me.Range("H5")
, se o manipulador de eventos estiver na página de código da planilha em questão (geralmente está):Espero que isto ajude...
fonte
H5
for alterada de outra planilha, digamossheet2
que a função acima não funcione. plz ajuda nisso.ActiveSheet
e sempre que você não especifica explicitamente que é o Excel com o qual está trabalhando, o Excel assumeApplication
.Worksheet_Change
evento deve ser localizado), um incondicionalRange
que não o padrão paraActiveSheet
mas em vez refere-se à folha que contém o código. O código nesta resposta é, portanto, efetivamente o mesmo que o código na pergunta. (Observação: em 2009, quando esta resposta foi escrita, pode ter sido diferente, mas tenho quase certeza de que não.)Lidar com o
Worksheet_Change
evento ou oWorkbook_SheetChange
evento.Os manipuladores de eventos usam um argumento "Alvo como intervalo", para que você possa verificar se o intervalo que está mudando inclui a célula na qual está interessado.
fonte
Target.Address = Range("H5").Address
,. Existe uma maneira mais fácil?Not (Intersect(Target, Range("H5")) Is Nothing)
. É assim que você faria?Target.Address = Range("H5").Address
) não funcionaria se sua célula fosse apenas parte do intervalo alterado. O segundo comentário ainda sofre os problemas descritos por Mike Rosenblum.Passei muito tempo pesquisando isso e aprendendo como tudo funciona, depois de realmente bagunçar os gatilhos de eventos. Como havia tantas informações espalhadas, decidi compartilhar o que descobri para funcionar em um só lugar, passo a passo da seguinte maneira:
1) Abra o VBA Editor, em VBA Project (YourWorkBookName.xlsm), abra o objeto Microsoft Excel e selecione a planilha à qual o evento de alteração se refere.
2) A visualização do código padrão é "Geral". Na lista suspensa na parte superior central, selecione "Planilha".
3) Private Sub Worksheet_SelectionChange já está lá como deveria estar, deixe como está. Copie / cole o código de Mike Rosenblum acima e altere a referência .Range para a célula para a qual você está procurando uma alteração (B3, no meu caso). Não coloque sua macro ainda, no entanto (removi a palavra "Macro" depois de "Então"):
ou na lista suspensa no canto superior esquerdo, 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" desligue os eventos para que quando você chamar a sua macro, ela não acione eventos e tente executar esta Worksheet_Change novamente em um ciclo sem fim que trava o Excel e / ou bagunça tudo:
5) Chame sua macro
6) Ative os eventos novamente para que a próxima mudança (e qualquer / todos os outros eventos) seja acionada:
7) Termine o bloco If e o Sub:
Todo o código:
Isso ativa / desativa eventos dos Módulos, o que cria problemas e simplesmente permite que a alteração seja acionada, desativa eventos, executa sua macro e ativa os eventos novamente.
fonte
Eu prefiro assim, não usando uma célula, mas um intervalo
fonte
Tenho um celular que está vinculado ao banco de dados de ações online e é atualizado com frequência. Quero acionar uma macro sempre que o valor da célula for atualizado.
Eu acredito que isso é semelhante à alteração do valor da célula por um programa ou qualquer atualização de dados externa, mas os exemplos acima de alguma forma não funcionam para mim. Acho que o problema é porque os eventos internos do Excel não são acionados, mas é o meu palpite.
Eu fiz o seguinte,
fonte