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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top