Annuler une macro sur excel

plastickman -  
melanie1324 Messages postés 1561 Statut Membre -
Bonjour,
J'aimerai pouvoir annuler une macro dans excel en appuyant à nouveau sur le bouton qui lui est dédié. Je pense que c'est possible mais je ne sais pas comment faire. Merci de votre aide.

jp

10 réponses

melanie1324 Messages postés 1561 Statut Membre 156
 
Bonjour,

je ne comprends pas très bien ton utilité.
Tu appuies une première fois sur le bouton et ca éxécute la macro.
Et lorsque tu rappuies sur le bouton, tu veux que le bouton disparaisse? Tu veux que la macro disparaisse? Ou tout simplement désactiver le clic sur le bouton?
0
plasticman
 
Effectivement, je n'ai pas été très clair ...
Je voudrais que lorsque je rappuie sur le même bouton, annuler l'action précédente, pouvoir revenir en arrière en fait. Par exemple: en admettant que l'action affectée à mon bouton soit de masquer une ligne, j'aimerais que si j'appuie une seconde fois sur le bouton, la ligne concernée réapparaisse.
J'espère que je suis un peu plus clair.
0
melanie1324 Messages postés 1561 Statut Membre 156
 
bonjour,

voici le code :

Private Sub CommandButton1_Click()
Application.Undo
End Sub

Attention, petit piège, il faut que la propriété TakeFocusOnClick du bouton soit à False.
0
plastickman
 
Je suis pas sure de bien comprendre, il faut que je rajoute ce code à la fin de celui déjà affecté au bouton? C'est possible de mettre 2 codes sur le même bouton? Ou alors je dois juste rajouté la ligne "application.undo" à la fin juste avant le "End sub" du premier code ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
Bonsoir,

Pour annuler les actions faites par macro tu n'as pas d'autre choix que de sauvegarder avant d'executer la macro et de restaurer.
A moins que ce ne soient que des actions simples sans perte de données auquel cas tu fais les actions inverses...
eric
0
melanie1324
 
Bonjour,
Le code que je lui ai donné fonctionne.
Il faut que tu mettes la ligne Application.Undo entre sub et end sub de ton code.
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
Bonjour,

Si on suit la doc excel undo n'annule que la dernière action faite par l'utilisateur, pas l'ensemble des actions d'une macro.
eric
0
plastickman
 
Si j'ai bien compris, la seule solution serait de commencer mon code existant par "activeworkbook.save" et de créer un second code avec un second bouton qui restaurerait le fichier. Mais je ne connais pas le code qui permet de restaurer. Est ce que tu le connais ?

jp
0
melanie1324 Messages postés 1561 Statut Membre 156
 
Bonjour,

Pour ca, j'aurais besoin de savoir ce que fais ta première macro pour que tu veuilles annuler les actions de cette dernière.
0
plastickman
 
Bonjour,
En fait il y en a plusieurs:

Sub Conclusion()
'
' Conclusion Macro
' Macro enregistrée le 02/01/2008 par PERSO
'

'
Application.ScreenUpdating = False
Sheets("conclusion").Activate
Range("D14:D424").Select
For Each o In Selection
If o.Value = "NON" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "DOUTE" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "0" Then
o.EntireRow.Hidden = True
End If
Next
Range("D430:D840").Select
For Each o In Selection
If o.Value = "NON" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "OUI" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "0" Then
o.EntireRow.Hidden = True
End If
Next
Dim myvar As String, i As Integer, x As Boolean
i = 14
x = True
Do While i <> 424
If Range("D" & i).Value = "OUI" Then
x = False
Exit Do
End If
i = i + 1
Loop
If x = False Then Rows("5:6").RowHeight = 0.15
If x = True Then Rows("7:8").RowHeight = 0.15

Worksheets("fiche récapitulative").Activate
Call Tri_Efface_doubles([B7:B51])
Call Tri_Efface_doubles([B54:B98])
Call Tri_Efface_doubles([B101:B192])
Call Tri_Efface_doubles([B195:B286])
Call Tri_Efface_doubles([B289:B334])
Call Tri_Efface_doubles([B337:B382])
Call Tri_Efface_doubles([B385:B429])

Range("B7:B51").Select
For Each o In Selection
If o.Value = "" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "0" Then
o.EntireRow.Hidden = True
End If
Next
Range("B54:B98").Select
For Each o In Selection
If o.Value = "" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "0" Then
o.EntireRow.Hidden = True
End If
Next
Range("B101:B192").Select
For Each o In Selection
If o.Value = "" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "0" Then
o.EntireRow.Hidden = True
End If
Next
Range("B195:B286").Select
For Each o In Selection
If o.Value = "" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "0" Then
o.EntireRow.Hidden = True
End If
Next
Range("B289:B334").Select
For Each o In Selection
If o.Value = "" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "0" Then
o.EntireRow.Hidden = True
End If
Next
Range("B337:B382").Select
For Each o In Selection
If o.Value = "" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "0" Then
o.EntireRow.Hidden = True
End If
Next
Range("B385:B429").Select
For Each o In Selection
If o.Value = "" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "0" Then
o.EntireRow.Hidden = True
End If
Next

Range("i435:i845").Select
For Each o In Selection
If o.Value = "NON" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "DOUTE" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "0" Then
o.EntireRow.Hidden = True
End If
Next
Range("i852:i1262").Select
For Each o In Selection
If o.Value = "NON" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "OUI" Then
o.EntireRow.Hidden = True
End If
Next
For Each o In Selection
If o.Value = "0" Then
o.EntireRow.Hidden = True
End If
Next

Sheets("FACTURE - devis").Select
Range("F46:F49").Select
For Each o In Selection
If o.Value = "" Then
o.EntireRow.Hidden = True
End If
Next
Sheets("Renseignements").Activate
If Range("l23") <> 1 Then
Sheets(Array("couverture DTA", "fiche récapitulative")).Delete
End If
If Range("l23") = 1 Then
Sheets("amiante").Delete
End If
Sheets("conclusion").Activate
Range("c10").Select
Application.ScreenUpdating = True
End Sub


sachant que:

Sub Tri_Efface_doubles(plage) ' As Range)
Dim lig As Double ' ligne
Dim MJE As Boolean ' mise à jour écran
Dim RCL As Boolean ' type calcul
On Error GoTo Fin ' Sauvegarde des paramètres actuels d'affichage et de recalcul
If Application.ScreenUpdating Then MJE = True ' mise à jour écran
If Application.Calculation = xlCalculationAutomatic Then RCL = True ' type calcul
Application.Calculation = xlCalculationManual ' type calcul
Application.ScreenUpdating = False ' mise à jour écran
'tri plage initiale
plage.Sort Key1:=Cells(plage.Row, plage.Column), Order1:=xlAscending, Header:=xlNo _
, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
For lig = plage.Row To plage.Count + plage.Row ' boucle sur plage
If Cells(lig + 1, plage.Column) = Cells(lig, plage.Column) Then
Cells(lig, plage.Column) = "" 'double effacé
End If
Next lig 'tri plage sans doubles
plage.Sort Key1:=Cells(plage.Row, plage.Column), Order1:=xlAscending, Header:=xlNo _
, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Fin: ' paramètres initiaux
If MJE Then Application.ScreenUpdating = True
If RCL Then Application.Calculation = xlCalculationAutomatic
End Sub
0
melanie1324 Messages postés 1561 Statut Membre 156
 
Bonjour,

Ma question risque d'être bête mais plutôt que de chercher à annuler ce que te fais la macro pourquoi via la macro ne pas ajouter un nouveau classeur, copier les feuilles sur lesquelles tu veux travailler et faire ce que tu as à faire sur ce novueau classeur?

Ainsi, tu as une sauvegarde de l'ancien et tu travailles sur un nouveau.
0