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
Où "H5"
est la cellule particulière surveillée et Macro
est le nom de la macro.
Est-il un meilleur moyen?
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...
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.
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
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.
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