exécuter automatiquement une macro Excel sur un changement de cellule

Comment puis-je exécuter automatiquement une macro Excel chaque fois qu'une valeur dans une cellule particulière change?

En ce moment, mon code de travail est:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub

"H5" est la cellule particulière surveillée et Macro est le nom de la macro.

Est-il un meilleur moyen?

77
demandé sur casperOne 2009-01-03 20:33:22

5 réponses

Votre code semble plutôt bon.

Attention, cependant, car votre appel à Range("H5") est une commande de raccourci vers Application.Range("H5"), ce qui équivaut à Application.ActiveSheet.Range("H5"). Cela pourrait être bien, si les seules modifications sont les modifications de l'utilisateur - ce qui est le plus typique-mais il est possible que les valeurs de cellule de la feuille de calcul changent quand ce n'est pas la feuille active via des changements programmatiques, par exemple VBA.

Dans cet esprit, j'utiliserais 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 vous pouvez utiliser Me.Range("H5"), si le gestionnaire d'événements page de code pour la feuille de calcul en question (c'est généralement le cas):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
End Sub

J'espère que cela aide...

98
répondu Mike Rosenblum 2018-07-30 13:26:34

Gère l'événement Worksheet_Change ou l'événement Workbook_SheetChange.

Les gestionnaires d'événements prennent un argument "Target As Range", vous pouvez donc vérifier si la plage qui change inclut la cellule qui vous intéresse.

7
répondu Joe 2018-07-30 13:27:18

Je préfère de cette façon, ne pas utiliser une cellule mais une plage

    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
3
répondu Javier Torón 2009-01-04 11:58:04

J'ai passé beaucoup de temps à faire des recherches et à apprendre comment tout cela fonctionne, après avoir vraiment gâché les déclencheurs de l'événement. Comme il y avait tellement d'informations dispersées, j'ai décidé de partager ce que j'ai trouvé pour travailler en un seul endroit, étape par étape comme suit:

1) Ouvrez L'éditeur VBA, sous le projet VBA (YourWorkBookName.XLSM) ouvrez L'objet Microsoft Excel et sélectionnez la feuille à laquelle l'événement de modification se rapportera.

2) la vue de code par défaut est "général"."À partir de la liste déroulante en haut au milieu, sélectionnez " Feuille de calcul."

3) le sous-Worksheet_SelectionChange privé est déjà là comme il se doit, laissez-le tranquille. Copiez / collez le code de Mike Rosenblum d'en haut et changez le .Gamme référence à la cellule pour laquelle vous regardez pour un changement (B3, dans mon cas). Ne placez pas encore votre Macro, cependant (j'ai supprimé le mot "Macro" après "Then"):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub

Ou dans la liste déroulante en haut à gauche, sélectionnez "Modifier" et dans L'espace entre Private Sub et End Sub, coller If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

4) sur la ligne après "puis" désactivez les événements de sorte que lorsque vous appelez votre macro, elle ne déclenche pas d'événements et essaie d'exécuter à nouveau ce Worksheet_Change dans un cycle sans fin qui plante Excel et / ou gâche tout:

Application.EnableEvents = False

5) appelez votre macro

Call YourMacroName

6) réactivez les événements afin que le prochain changement (et tous les autres événements) se déclenche:

Application.EnableEvents = True

7) termine le bloc If et le Sub:

    End If
End Sub

Le code entier:

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

Cela prend activer/désactiver les événements des Modules, ce qui crée des problèmes et permet simplement de déclencher le changement, d'éteindre les événements, d'exécuter votre macro et de réactiver les événements.

2
répondu Eric Vaughn-Shobey 2018-07-11 22:51:50

J'ai une cellule qui est liée à la base de données stock En ligne et mise à jour fréquemment. Je veux déclencher une macro chaque fois que la valeur de la cellule est mise à jour.

Je crois que cela est similaire au changement de valeur de cellule par un programme ou toute mise à jour de données externes, mais les exemples ci-dessus ne fonctionnent pas pour moi. Je pense que le problème est parce que les événements internes d'excel ne sont pas déclenchés, mais c'est ma conjecture.

J'ai fait ce qui suit,

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
0
répondu Juan Garcia 2010-04-20 17:22:22