web-dev-qa-db-fra.com

exécuter automatiquement une macro Excel lors d'un changement de cellule

Comment puis-je exécuter automatiquement une macro Excel chaque fois qu'une valeur d'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.

Y a-t-il un meilleur moyen?

87
namin

Votre code est plutôt beau.

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 suffire si les seules modifications sont des modifications apportées par l'utilisateur (ce qui est le plus typique), mais il est possible que les valeurs des cellules de la feuille de calcul changent lorsqu'il ne s'agit pas de la feuille active via des modifications programmatiques, par ex. VBA.

Dans cet esprit, je voudrais utiliser 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 se trouve sur la page de code de 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 t'aides...

106
Mike Rosenblum

Traitez l'événement Worksheet_Change ou Workbook_SheetChange.

Les gestionnaires d'événements prennent un argument "Target As Range" afin que vous puissiez vérifier si la plage en cours de modification inclut la cellule qui vous intéresse.

7
Joe

Je préfère cette façon, pas en utilisant 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
Javier Torón

J'ai passé beaucoup de temps à rechercher cela et à comprendre comment tout cela fonctionne, après avoir vraiment gâché les déclencheurs d'événements. Comme il y avait tellement d'informations éparses, j'ai décidé de partager ce que j'ai trouvé de fonctionner au même endroit, étape par étape, comme suit:

1) Ouvrez l'éditeur VBA, sous Projet VBA (YourWorkBookName.xlsm), ouvrez un objet Microsoft Excel et sélectionnez la feuille à laquelle l'événement de modification s'appliquera.

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

3) Private Sub Worksheet_SelectionChange est déjà là comme il se doit, laissez-le tranquille. Copiez/collez le code de Mike Rosenblum d’en haut et modifiez la référence .Range à la cellule pour laquelle vous attendez un changement (B3, dans mon cas). Toutefois, ne placez pas encore votre macro (j'ai supprimé le mot "macro" après "alors"):

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, collez If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

4) Sur la ligne après "Alors", désactivez les événements pour que, lorsque vous appelez votre macro, les événements ne soient pas déclenchés et que vous ne tentiez pas d'exécuter à nouveau cette feuille de calcul dans un cycle sans fin qui bloque Excel et/ou gâche tout:

Application.EnableEvents = False

5) Appelez votre macro

Call YourMacroName

6) Réactivez les événements pour que le prochain changement (et tout autre événement) déclenche:

Application.EnableEvents = True

7) Terminez les blocs If et 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 nécessite l'activation/la désactivation des événements des modules, ce qui crée des problèmes et permet simplement au déclencheur de changer, de désactiver les événements, d'exécuter votre macro et de réactiver les événements.

2
Eric Vaughn-Shobey

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

Je crois que cela ressemble à un changement de valeur de cellule par un programme ou toute mise à jour de données externe, mais les exemples ci-dessus ne fonctionnent pas pour moi d'une manière ou d'une autre. Je pense que le problème vient du fait que les événements internes d'Excel ne sont pas déclenchés, mais c'est ce que je suppose.

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
Juan Garcia