Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Général VBA
Général VBA Forum général VBA . Pour les logiciels spécifiques (Access, Excel, Word, ...), postez dans les bons sous forums.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/10/2005, 17h05   #1
Invité de passage
 
Inscription : juin 2005
Messages : 9
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 9
Points : 2
Points : 2
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.
cbonnard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2005, 17h16   #2
Membre chevronné
 
Avatar de Catbull
 
Inscription : avril 2003
Messages : 542
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : avril 2003
Messages : 542
Points : 767
Points : 767
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.
__________________
CatBull - Modérateur VB
Catbull est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2005, 17h44   #3
Membre Expert
 
Avatar de Megaxel
 
Inscription : mai 2003
Messages : 1 188
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 1 188
Points : 1 308
Points : 1 308
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...
Megaxel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2005, 18h14   #4
Membre chevronné
 
Avatar de Theocourant
 
Inscription : janvier 2005
Messages : 618
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : janvier 2005
Messages : 618
Points : 700
Points : 700
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 :
1
2
3
 
ActiveSheet.Copy After:=Sheets.Count
WorkSheets(Sheets.Count).Visible = false
Bonne continuation

Théo
Theocourant est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2005, 18h16   #5
Membre Expert
 
Avatar de Megaxel
 
Inscription : mai 2003
Messages : 1 188
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 1 188
Points : 1 308
Points : 1 308
Hmmmm... Théo, ta réponse ressemble drôlement à celle de Catbull, les considérations de consommation de ressource en moins.
Megaxel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2005, 23h32   #6
Membre chevronné
 
Avatar de Theocourant
 
Inscription : janvier 2005
Messages : 618
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : janvier 2005
Messages : 618
Points : 700
Points : 700
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
Theocourant est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2005, 09h29   #7
Invité de passage
 
Inscription : juin 2005
Messages : 9
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 9
Points : 2
Points : 2
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?
cbonnard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2005, 09h59   #8
Membre Expert
 
Avatar de Megaxel
 
Inscription : mai 2003
Messages : 1 188
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 1 188
Points : 1 308
Points : 1 308
(Désolé, Théo. Mais je plaisantais...)
La propriété est
Code :
1
2
 
Worksheets(n).Visible = ...
et tu dois mettre la valeur à xlVeryHidden (ou xlHidden).
Megaxel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2005, 10h00   #9
Membre chevronné
 
Avatar de Theocourant
 
Inscription : janvier 2005
Messages : 618
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : janvier 2005
Messages : 618
Points : 700
Points : 700
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 :
Sheets("CetteFeuilleDoitDisparaitre").Visible = xlSheetVeryHidden
Bonne continuation

Théo

EDITION : J'ai corrigé le nom de la contante comme signalé par CatBull ci-dessous
Theocourant est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2005, 10h15   #10
Membre chevronné
 
Avatar de Catbull
 
Inscription : avril 2003
Messages : 542
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : avril 2003
Messages : 542
Points : 767
Points : 767
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 :
Sheets("CetteFeuilleDoitDisparaitre").Visible = xlVeryHidden
Bonne continuation

Théo
L'explication est correcte, mais la constante à utiliser est xlSheetVeryHidden et non xlVeryHidden.
__________________
CatBull - Modérateur VB
Catbull est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2005, 10h53   #11
Membre Expert
 
Avatar de Megaxel
 
Inscription : mai 2003
Messages : 1 188
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 1 188
Points : 1 308
Points : 1 308
Ok, c'est vrai. Bon être exhaustif, les trois valeurs possibles sont:
xlSheetVisible : -1
xlSheetHidden : 0
xlSheetVeryHidden : 2
Megaxel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2005, 16h56   #12
Invité de passage
 
Inscription : juin 2005
Messages : 9
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 9
Points : 2
Points : 2
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?
cbonnard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2005, 17h06   #13
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Pour
Citation:
Worksheets(Sheets.Count).Visible = xlSheetVeryHidden
c'est normal

Code :
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+
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2005, 17h12   #14
Invité de passage
 
Inscription : juin 2005
Messages : 9
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 9
Points : 2
Points : 2
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
cbonnard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2005, 17h14   #15
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Bon, alors voilà :

Code :
NbFeuill = ActiveWorkbook.Worksheets.Count
pour compter les feuilles
ce qui me fait corriger le message précédent

Code :
1
2
3
For i = 1 to Workbooks(NomFich).Worksheets.Count'ou for each... 
      Worksheets(i).Visible  = xlSheetVeryHidden 
Next
et donc

Code :
1
2
    NomFeuil = Activesheet.name
    Sheets(NomFeuil) Copy After:=Sheets(NbFeuill)
A+
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2005, 17h19   #16
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Nos posts se sont croisés

Code :
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
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h12.


 
 
 
 
Partenaires

Hébergement Web