IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Discussion :

Faire un undo sur une macro


Sujet :

VBA

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Faire un undo sur une macro
    bonjour, j'ai un classeur contenant une serie de feuilles, et ces feuilles subissent des actions par macro, j'aimerai que l'utilisateur puisse annuler l'action de la derniere macro,
    je pensais ainsi faire:

    -sauvegarde feuille active
    -action macro
    -si annulation action alors restauration de la sauvegarde feuille active

    concernant la sauvegarde je ne sais pas comment faire, y a t il une fonction pour mettre en memoire la feuille active? OU suis je obligé de faire une copie sur le disk de cette feuille et si oui comment?

    Merci d'avance. cyril.

  2. #2
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Citation Envoyé par msdn a propos de la commande Undo
    Remarque

    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.
    Ta solution est un paliatif simple à mettre en oeuvre pour implémenter ton propre undo. Pour réaliser ton undo, tu peux dupliquer la feuille dans ton classeur en définissant la propriété Visible de la feuille à xlSheetVeryHidden afin qu'elle reste inaccessible à l'utilisateur.

    En ce qui concerne le nommage de la feuille tu peux soit la préfixer ou la suffixer. Un truc du genre UNDO_COPY_Nom_de_la_feuille_d'origine. Donc si la feuille sur laquelle tu travailles est budget_2005, la copie s'appelle UNDO_COPY_budget_2005.

    L'inconvénient de cette méthode c'est qu'elle consomme bcp de ressources. Si ta macro travaille sur 50 feuilles, il faut autant de feuilles temporaires. Dans ce cas tu dois implémenter une solution qui enregistre le delta. C'est une solution plus sobre en ressources mais plus longue à mettre en place.

  3. #3
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    C'est vrai que s'il y a beaucoup d'onglets dans le classeur, on peut enregistrer au format csv les feuilles juste avant le démarrage du traitement. Et si l'utilisateur valide le résultat, on supprime les fichiers.
    Mais ça ne marche que pour des données simples. S'il y a des formules, des liens, des commentaires...
    Honnêtement, la solution de copie de l'onglet en mode "invisible" est beaucoup plus simple...

  4. #4
    Membre éclairé
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Points : 739
    Points
    739
    Par défaut
    Salut,

    L'idée peut être de copier la feuille avant exécution de la macro et de la rendre invisible.

    Pour copier la feuille active en dernière position et la cacher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ActiveSheet.Copy After:=Sheets.Count
    WorkSheets(Sheets.Count).Visible = false
    Bonne continuation

    Théo

  5. #5
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Hmmmm... Théo, ta réponse ressemble drôlement à celle de Catbull, les considérations de consommation de ressource en moins.

  6. #6
    Membre éclairé
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Points : 739
    Points
    739
    Par défaut
    Citation Envoyé par Megaxel
    Hmmmm... Théo, ta réponse ressemble drôlement à celle de Catbull, les considérations de consommation de ressource en moins.
    Faut pas trop m'en demander j'avais mon chef dans le bureau entre le début du post et l'expédition .......

    Et je me voyais mal lui dire "Dis tu peux attendre 2 minutes que je teste et que j'envoie un message avant qu'on continue à parler du projet? Merci"


    Théo

  7. #7
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci pour cette réponse rapide! je vais mettre en place la solution la plus simple!
    si cela n'est pas suffisant j'enchainerais sur la 2eme solution!

    Merci a tous!


    PS: que dois je utiliser la propriété xlVeryHidden ou la propriete Visible?

  8. #8
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    (Désolé, Théo. Mais je plaisantais...)
    La propriété est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Worksheets(n).Visible = ...
    et tu dois mettre la valeur à xlVeryHidden (ou xlHidden).

  9. #9
    Membre éclairé
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Points : 739
    Points
    739
    Par défaut
    Citation Envoyé par cbonnard
    PS: que dois je utiliser la propriété xlVeryHidden ou la propriete Visible?
    Salut,

    C'est la propriété Visible à qui tu donnes la valeur xlVeryHidden

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("CetteFeuilleDoitDisparaitre").Visible = xlSheetVeryHidden
    Bonne continuation

    Théo

    EDITION : J'ai corrigé le nom de la contante comme signalé par CatBull ci-dessous

  10. #10
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Citation Envoyé par Theocourant
    Citation Envoyé par cbonnard
    PS: que dois je utiliser la propriété xlVeryHidden ou la propriete Visible?
    Salut,

    C'est la propriété Visible à qui tu donnes la valeur xlVeryHidden

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("CetteFeuilleDoitDisparaitre").Visible = xlVeryHidden
    Bonne continuation

    Théo
    L'explication est correcte, mais la constante à utiliser est xlSheetVeryHidden et non xlVeryHidden.

  11. #11
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Ok, c'est vrai. Bon être exhaustif, les trois valeurs possibles sont:
    xlSheetVisible : -1
    xlSheetHidden : 0
    xlSheetVeryHidden : 2

  12. #12
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Chti pb, cha marche po :

    ActiveSheet.Copy After:=Sheets.Count

    -->erreur 1004

    pareil pour:

    Worksheets(Sheets.Count).Visible = xlSheetVeryHidden

    -->erreur 1004

    quoi que j'ai fait de mal?

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Pour
    Worksheets(Sheets.Count).Visible = xlSheetVeryHidden
    c'est normal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For i = 1 to Workbooks(NomFich).Sheets.Count 'ou for each...
          Worksheets(i).Visible  = xlSheetVeryHidden
    Next
    aurait des chances de marcher
    Pas essayé
    Quant à ton autre pb, je regarde

    A+

  14. #14
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    peux tu m'expliquer pourquoi ce que je fais ne marche pas et pourquoi avec i ca marcherai?
    de plus je ne veux pas les cacher toutes! :o

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Bon, alors voilà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbFeuill = ActiveWorkbook.Worksheets.Count
    pour compter les feuilles
    ce qui me fait corriger le message précédent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 to Workbooks(NomFich).Worksheets.Count'ou for each... 
          Worksheets(i).Visible  = xlSheetVeryHidden 
    Next
    et donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        NomFeuil = Activesheet.name
        Sheets(NomFeuil) Copy After:=Sheets(NbFeuill)
    A+

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Nos posts se sont croisés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        NbFeuill = ActiveWorkbook.Worksheets.Count
        NomFeuil = Activesheet.name 
        Sheets(NomFeuil) Copy After:=Sheets(NbFeuill)
        NomFeuil = Activesheet.name 'tu peux aussi le faire par l'index
        Worksheets(NomFeuil).Visible  = xlSheetVeryHidden
    Et bien sûr, une fois que tu as le principe, tu simplifies

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Besoin d'aide pour faire une boucle loop sur une macro
    Par spacesheep dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/04/2010, 11h42
  2. Faire des modifs sur une sheet excel Read Only via VBA
    Par beegees dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/11/2005, 18h02
  3. Faire un select sur une quantité défini d'élément
    Par tripper.dim dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/06/2005, 11h14
  4. Faire un Lock sur une table pendant l'exec d'un DTS
    Par Pete dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/03/2005, 14h17
  5. Selectionnet tous ou faire un clear sur une liste
    Par Canou dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/11/2004, 10h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo