Comment puis-je exécuter automatiquement une macro Excel chaque fois qu'une valeur dans une cellule particulière change?
À l'heure actuelle, 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.
Y a-t-il un meilleur moyen?
excel
vba
automation
namin
la source
la source
Réponses:
Votre code est plutôt bon.
Attention cependant, votre appel à
Range("H5")
est une commande de raccourci versApplication.Range("H5")
, ce qui équivaut àApplication.ActiveSheet.Range("H5")
. Cela pourrait être bien, si les seuls changements sont des changements d'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")
:Ou vous pouvez utiliser
Me.Range("H5")
, si le gestionnaire d'événements se trouve sur la page de codes de la feuille de calcul en question (c'est généralement le cas):J'espère que cela t'aides...
la source
H5
est modifiée à partir d'une autre feuille, disons quesheet2
la fonction ci-dessus ne fonctionne pas. plz aide dans ce domaine.ActiveSheet
et chaque fois que vous ne spécifiez pas explicitement que vous travaillez avec Excel, Excel supposeApplication
.Worksheet_Change
événement doit être localisé), un non qualifiéRange
ne correspond pas par défautActiveSheet
à la feuille contenant le code, mais à la place. Le code de cette réponse est donc effectivement le même que celui de la question. (Remarque: en 2009, lorsque cette réponse a été écrite, elle avait peut- être été différente, mais je suis presque certain que ce n'était pas le cas.)Gérez l'
Worksheet_Change
événement ou l'Workbook_SheetChange
événement.Les gestionnaires d'événements prennent un argument "Target As Range", afin que vous puissiez vérifier si la plage qui change inclut la cellule qui vous intéresse.
la source
Target.Address = Range("H5").Address
. Y a-t-il un moyen plus simple?Not (Intersect(Target, Range("H5")) Is Nothing)
. Est-ce ainsi que vous feriez?Target.Address = Range("H5").Address
) ne fonctionnerait pas si votre cellule ne faisait que partie de la plage modifiée. Le deuxième commentaire souffre encore des problèmes décrits par Mike Rosenblum.J'ai passé beaucoup de temps à faire des recherches et à apprendre comment tout cela fonctionne, après avoir vraiment gâché les déclencheurs d'événements. Comme il y avait tellement d'informations dispersées, j'ai décidé de partager ce que j'ai trouvé pour fonctionner en un seul endroit, étape par étape comme suit:
1) Ouvrez l'éditeur VBA, sous 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". 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 seul. Copiez / collez le code de Mike Rosenblum ci-dessus 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 "Then"):
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 "Then", désactivez les événements afin que lorsque vous appelez votre macro, elle ne déclenche pas d'événements et essayez d'exécuter à nouveau ce Worksheet_Change dans un cycle sans fin qui plante Excel et / ou tout gâche:
5) Appelez votre macro
6) Réactivez les événements pour que le prochain changement (et tous les autres événements) se déclenche:
7) Terminez le bloc If et le Sub:
Le code entier:
Cela nécessite l'activation / désactivation des événements des modules, ce qui crée des problèmes et laisse simplement le changement se déclencher, désactive les événements, exécute votre macro et réactive les événements.
la source
Je préfère cette façon, pas en utilisant une cellule mais une plage
la source
J'ai une cellule qui est liée à la base de données de stock 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 externes, mais les exemples ci-dessus ne fonctionnent pas pour moi. Je pense que le problème est que les événements internes d'Excel ne sont pas déclenchés, mais c'est mon hypothèse.
J'ai fait ce qui suit,
la source