Annuler une macro sur excel

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
Configuration: Mac OS X
Firefox 3.5.2

10 réponses

  • Votes
  • Date
  • Date décroissante
  1. 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?
    1. 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.
      1. 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.
        1. 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 ?
          1. Contributeur
            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
            1. 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.
              1. Contributeur
                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
            2. 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
              1. 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.
                1. 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
                  1. 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.