Retour arrière avec une macro
Bonjour
J'ai une macro qui filtre un tableau PowerQuery lorsque je clique sur certaines cases.
Cependant, lorsque je fais des modifications dans le fichier et que je clique accidentellement sur ces cases, la macro se lance et je perds la possibilité d'annuler les modifications que j'ai faites manuellement ailleurs dans le fichier.
Annuler ou non les modifications de la macro n'est pas un problème, je veux juste pouvoir, après exécution de la macro, revenir en arrière sur mes modifications manuelles
Merci d'avance pour votre retour :)
Cordialement,
Parrish_FR
Bonjour,
Chatgpt :
En VBA, il n'est pas possible de capturer et de restaurer directement la pile d'annulation (Undo) d'Excel. La pile d'annulation est une fonctionnalité interne d'Excel qui ne peut pas être manipulée via le code VBA. Une fois qu'une macro est exécutée, la pile d'annulation est effacée.
Cependant, il est possible de contourner ce problème en créant un mécanisme personnalisé pour sauvegarder l'état de la feuille avant l'exécution d'une macro et de le restaurer si nécessaire. Bien que cela ne permette pas de conserver la pile d'annulation native d'Excel, cela offre une méthode alternative pour "annuler" les modifications apportées par une macro.
### Solution: Utiliser des Snapshots de la Feuille
Cette approche implique de créer des "snapshots" de la feuille avant l'exécution de la macro et de restaurer ces snapshots si nécessaire.
#### Exemple de code VBA:
1. Sauvegarder l'état de la feuille (snapshot).
2. Exécuter la macro.
3. Restaurer l'état de la feuille (snapshot) si nécessaire.
Dim sheetSnapshot As Variant ' Fonction pour sauvegarder l'état de la feuille Sub SaveSheetSnapshot(sheet As Worksheet) sheetSnapshot = sheet.UsedRange.Value End Sub ' Fonction pour restaurer l'état de la feuille Sub RestoreSheetSnapshot(sheet As Worksheet) If Not IsEmpty(sheetSnapshot) Then sheet.UsedRange.Value = sheetSnapshot Else MsgBox "Aucun snapshot sauvegardé." End If End Sub ' Exemple de macro qui modifie la feuille Sub ExampleMacro() ' Sauvegarder l'état de la feuille avant la modification SaveSheetSnapshot ActiveSheet ' Désactiver les événements pour éviter de perturber la pile d'annulation Application.EnableEvents = False ' Effectuer des modifications (exemple) ActiveSheet.Range("A1").Value = "Nouvelle valeur" ActiveSheet.Range("A2").Value = "Autre valeur" ' Réactiver les événements Application.EnableEvents = True End Sub ' Macro pour annuler les modifications faites par la macro Sub UndoExampleMacro() ' Restaurer l'état de la feuille RestoreSheetSnapshot ActiveSheet End Sub### Utilisation:
1. Exécutez `ExampleMacro` pour effectuer des modifications et sauvegarder l'état actuel de la feuille.
2. Si vous avez besoin d'annuler ces modifications, exécutez `UndoExampleMacro` pour restaurer l'état précédent de la feuille.
### Explication:
- `SaveSheetSnapshot` : Sauvegarde l'état actuel de la feuille dans la variable `sheetSnapshot`.
- `RestoreSheetSnapshot` : Restaure l'état de la feuille à partir de la variable `sheetSnapshot`.
- `ExampleMacro` : Exemple de macro qui modifie la feuille après avoir sauvegardé son état.
- `UndoExampleMacro` : Restaure l'état de la feuille sauvegardé avant l'exécution de `ExampleMacro`.
### Limitations:
- Cette approche fonctionne bien pour des modifications simples. Pour des modifications plus complexes, comme les mises en forme conditionnelles ou les graphiques, vous devrez peut-être étendre la logique de sauvegarde et de restauration.
- La pile d'annulation native d'Excel ne sera pas conservée pour les actions manuelles faites au clavier, mais cette méthode permet de gérer les états avant et après l'exécution des macros.
En résumé, bien que nous ne puissions pas capturer et restaurer directement la pile d'annulation d'Excel, nous pouvons implémenter une solution alternative qui permet de sauvegarder et de restaurer l'état de la feuille, offrant ainsi une certaine capacité d'annulation pour les modifications apportées par les macros.
Bonjour,
dvsorthographie
Merci pour ta réponse, cependant, cela ne correspond pas à ma demande vu que je ne souhaite pas annuler ce qu'a fait la macros mais conserve un retour arrière sur mes modifications manuels dans le fichier.
Si, ça répond exactement à ta demande.
La pile d'annulation est une fonctionnalité interne d'Excel qui ne peut pas être manipulée via le code VBA. Une fois qu'une macro est exécutée, la pile d'annulation est effacée.
En fait ce que tu demandes n'est pas possible !