Question

Comment puis-je exécuter automatiquement une macro Excel chaque fois qu'une valeur d'une cellule particulière est modifiée?

À l'heure actuelle, mon code de travail est le suivant:

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 le nom de la macro.

Y a-t-il un meilleur moyen?

Était-ce utile?

La solution

Votre code est plutôt beau.

Soyez prudent, cependant, pour votre appel à Range ("H5") est une commande de raccourci vers Application.Range ("H5") , qui est équivalent à 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 de cellule 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, 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

Vous pouvez également utiliser Me.Range ("H5") , si le gestionnaire d'événements se trouve sur la page de code de la feuille de calcul en question (ce qui 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 vous aidera ...

Autres conseils

Gérez l'événement Worksheet_Change ou l'événement 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.

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

J'ai passé beaucoup de temps à faire des recherches et à comprendre comment tout cela fonctionne, après avoir vraiment bousillé 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é 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 sera associé.

2) La vue de code par défaut est "Général". Dans la liste déroulante en haut au centre, 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). Cependant, 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 situé entre Private Sub et End Sub, collez Si non intersection (Cible, Me.Range ("H5")) n’est rien alors

4) Sur la ligne après "Then" Désactivez les événements de sorte que lorsque vous appelez votre macro, elle ne déclenche pas d'événements et n'essaye pas d'exécuter à nouveau cette Worksheet_Change dans un cycle sans fin qui bloque Excel et / ou sinon gâche tout:

Application.EnableEvents = False

5) Appelez votre macro

Call YourMacroName

6) Réactivez les événements pour que le prochain changement (et tous les autres) déclenche:

Application.EnableEvents = True

7) Terminez le bloc If et le sous-ensemble:

    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

Il faut activer / désactiver les événements des modules, ce qui crée des problèmes et laisse simplement le changement déclencher, désactiver les événements, exécuter votre macro et réactiver les événements.

J'ai une cellule liée à la base de données des stocks 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 pense que cela est similaire au changement de valeur de cellule par un programme ou à toute mise à jour de données externe, mais les exemples ci-dessus ne fonctionnent pas d'une manière ou d'une autre pour moi. 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top