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

10 réponses

  1. 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
  2. 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
  3. 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
  4. 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  7. 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
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
  8. 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
  9. 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
  10. 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
  11. 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