web-dev-qa-db-fra.com

Contournement d'événement de changement de feuille de travail VBA?

Je prépare un tableur. Le programmeur a créé une macro pour chaque feuille à déclencher lorsque la feuille est modifiée. C’est une bonne chose, car la couleur coordonne les détails de la feuille lorsque de nouvelles informations sont ajoutées. Je souhaite donc conserver cette fonction.

J'ai écrit une macro qui trie les données et permet le retrait et l'ajout de nouveaux employés. Cela est en conflit avec la macro d'événement de changement et provoque des erreurs si ma macro est opérationnelle. 

Q. Y a-t-il un moyen de contourner l'événement de changement de feuille de calcul pendant que la macro est en cours d'exécution et de le remettre en place une fois que la macro est terminée?

Voici le code pour l'événement change.

Private Sub Worksheet_Change(ByVal target As Excel.Range, skip_update As Boolean)
If skip_update = False Then
    Call PaintCell(target)
End If
End Sub

Ma macro génère des erreurs lorsque je fais référence à des feuilles de calcul ou à des plages.

13
user1545643

Je pense que vous voulez la propriété EnableEvents de l'objet Application. Lorsque vous définissez EnableEvents sur False, votre code ne déclenchera aucun événement et aucun autre code d'événement ne sera exécuté. Si, par exemple, votre code modifie une cellule, il déclenche normalement l'événement Change ou l'événement SheetChange. Cependant, si vous le structurez comme ceci

Application.EnableEvents = False
    Sheet1.Range("A1").Value = "new"
Application.EnableEvents = True

alors changer A1 ne déclenchera aucun événement.

Parfois, il est avantageux d’avoir votre code qui déclenche un événement et parfois ce n’est pas le cas. Utilisez EnableEvents lorsque vous souhaitez l’empêcher.

26
Dick Kusleika

Ceci est une modification importante de la réponse de @Dick Kusleika.

Lorsque vous désactivez le paramètre EnableEvents, il est judicieux d'inclure la gestion des erreurs pour réactiver EnableEvents. Si vous ne le faites pas et que le script génère une erreur, le déclencheur d'événement de modification (votre script) cessera de fonctionner jusqu'à ce que vous réactiviez manuellement EnableEvents.

Idéalement, vous placeriez la ligne suivante immédiatement avant tout code ayant à nouveau déclenché votre événement de modification. La première ligne indique à VBA d'accéder à une étiquette appelée "enableEventsOn" lorsqu'elle rencontre une erreur. La deuxième ligne contourne les événements de changement.

On Error Goto enableEventsOn:
Application.EnableEvents = False

Placez ensuite ce code immédiatement après le code qui a déclenché à nouveau votre événement de modification. Cela active à nouveau les déclencheurs d'événements de changement et renvoie la gestion normale des erreurs à votre script.

Application.EnableEvents = True
On Error Goto 0

Enfin, placez ce code à la fin de votre script. C'est une étiquette mentionnée ci-dessus. Si une erreur est rencontrée entre "On Error Goto enableEventsOn:" et "On Error Goto 0", le script ira ici et réactivera EnableEvents, le laissant prêt à démarrer le script lors du prochain changement de votre feuille de calcul.

enableEventsOn:
Application.EnableEvents = True
2
ChrisB

Trop risqué à mon avis.

J'utiliserais une variable nommée "skip_update" qui est définie sur "True" au début de chaque macro et sur False à la fin.

par exemple :

dim skip_update as Boolean = False

sub auto_macro_when_modify()
   if skip_update == True then
      exit sub ' NO CHANGE !
   end if
end sub

sub other_macro
    skip_update = True
    ' ( do stuff)
    skip_update = False
end sub
0
mansuetus

Vous pouvez maintenir la touche CTRL enfoncée tout en effectuant une entrée qui déclencherait la routine de modification à l'événement. J'ai une routine pour faire la somme des valeurs dans une plage sélectionnée dans une colonne donnée. Si je déplace le curseur des lignes 1 à 5, en les mettant en surbrillance, leur somme est enregistrée dans le presse-papiers. Toute entrée dans une cellule de cette colonne déclenche la routine. Si je maintiens la touche CTRL enfoncée pendant l'exécution de l'action souhaitée ou de toute entrée d'une cellule de la colonne, la routine n'est pas lancée. Peut ne pas fonctionner pour des scénarios ChangeEvent plus complexes.

0
Malcolm