Annuler une macro événementielle

Legolas

XLDnaute Occasionnel
Bonjour le fofo !

Je me retrouve devant un petit problème.
J'ai mis au point un outil Excel sur lequel tourne des macros événementielles Private Sub Worksheet_Change et Private Sub Worksheet_BeforeDoubleClick.

Le problème est lorsque l'utilisateur commet une erreur du type copier / coller : il lui est impossible d'annuler la manipulation (CTRL + Z) puisque l'évènement Worksheet_Change s'est produit... (et donc la macro a fait son oeuvre).

Avez vous une idée de comment je peux résoudre ce problème : avoir une macro événementielle et permettre l'annulation de la dernière modification "utilisateur" ?

Merci d'avance pour votre aide.
 

CHALET53

XLDnaute Barbatruc
Re : Annuler une macro événementielle

Bonjour,

Une approche

Cette fonction permet d'annuler le caractère événementiel de ta procédure

Sub Annul_Evènt()
Application.EnableEvents = False
End Sub

Il faut ensuite réactiver :

Sub Evénementiel()
Application.EnableEvents = true
End Sub
 

Legolas

XLDnaute Occasionnel
Re : Annuler une macro événementielle

Merci pour ton idée, mais j'utilise déjà cette ligne de code pour éviter que la macro ne s'appelle indéfiniment.

Dans l'idée, mon code est structuré comme :

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlManual

....... blabla

    Application.Calculation = xlAutomatic
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub

Et cela ne résout pas mon problème...
Le hic, s'est qu'une fois la macro lancée, l'annulation de la modification n'est plus possible...
 

CHALET53

XLDnaute Barbatruc
Re : Annuler une macro événementielle

Re

Pour répondre à Legolas :

Ta procédure réactive l'événementiel à la fin (donc il est de nouveau actif)

Si tu fais deux procédures séparées pour traiter ton cas spécifique : entre les deux lancements tu peux procéder aux corrections que tu veux : ta procédure événementielle ne sera pas exécutée puisque l'événementiel est désactivé
Il s'agit d'une procédure d'exception pour permettre tes corrections hors gestion événementielle
Après correction, relancer la deuxième procédure pour réactiver l'événementiel

D'où les deux pgm que je te propose

a+
 

david84

XLDnaute Barbatruc
Re : Annuler une macro événementielle

Bonjour,
regarde du côté de l'utilisation de Application.Undo
Extrait de l'aide Excel :
Référence du développeur Excel
Application.Undo, méthode
Cette méthode annule la dernière opération commandée à partir de l'interface utilisateur.
Syntaxe

expression.Undo

expression Variable qui représente un objet Application.

Remarques


Cette méthode n'annule que la dernière opération commandée par l'utilisateur avant l'exécution de la macro et doit figurer en première ligne dans la macro. Elle ne peut être utilisée pour annuler des commandes Visual Basic.


Exemple


Cet exemple montre comment annuler la dernière opération commandée à partir de l'interface utilisateur. L'exemple doit figurer en première ligne dans la macro.

Visual Basic pour Applications
Application.Undo
Une macro reliée à un raccourci clavier par exemple annule la dernière opération effectuée à partir du moment ou cette opération n'a pas été déclenchée par la procédure événementielle.
A voir si cela peut te servir dans ton cas précis (pas d'exemple fourni donc pas de test possible).
A+
 

Legolas

XLDnaute Occasionnel
Re : Annuler une macro événementielle

Bonjour !

Désolé, j'étais en déplacement hier et je n'ai pu testé cette méthode que ce matin.

Je n'arrive pas à ce que je souhaite...

Je vais détailler pas à pas les opérations réalisées, cela sera peut être plus clair.

Le fichier Excel permet de faire de la saisie semi-automatique en fonction de renseignements donnés par l'utilisateur.
Des cellules sont donc dédiées à l'utilisateur (cellules vides), d'autres ont des valeurs pré-enregistrées (validation de données avec liste des valeurs dans une feuille data) et d'autres sont remplies pas une macro événementielle en fonction de ce que l'utilisateur a rempli.

A chaque changement dans la feuille, la macro se lance. En fonction de ce qu'elle trouve, elle peut ne rien faire ou ajouter des valeurs dans ses cases dédiées.

Certains utilisateurs utilisent la fonction "copier/coller". Pourquoi pas.
Lorsque cela est bien utilisé, pas de problème.
Le problème est lorsqu'il copie/colle une plage de cellules (donc > à 1 cellule).
Ce copier/coller change la mise en forme des cellules, change les valeurs des cellules et les formules... bref ce n'est pas bon.
L'utilisateur en voyant la boulette veut faire "Annuler" mais rien ne se passe : de mon point de vue, c'est normal car la macro événementielle a déjà tourné !

Donc, ce que je souhaite faire : avoir une fonction/macro... qui me permette d'annuler une action utilisateur APRES les actions d'une macro événementielle.
J'ai testé :

VB:
Sub annuler()

    Application.Undo
    MsgBox ("Dernière action annulée")

End Sub
Et Excel me dit que me dit que la méthode 'Undo' de l'objet '_Application' à échoué...

Je vous joins un fichier Excel extremement simpliste pour illustrer sur lequel j'ai mis une macro événementielle.
Taper une valeur en cellule A1, en E5 apparait "C'est fait"
Essayer d'annuler... Voilà tout est dit. En fait, rien ne vaut un exemple.

A+
 

Pièces jointes

  • Exemple.xlsm
    12.2 KB · Affichages: 36
  • Exemple.xlsm
    12.2 KB · Affichages: 41
  • Exemple.xlsm
    12.2 KB · Affichages: 43

Discussions similaires

Statistiques des forums

Discussions
312 452
Messages
2 088 535
Membres
103 879
dernier inscrit
JJB2