[Excel][VBA]Empêcher le changmt de mise en page

Empêcher le changmt de mise en page [Excel][VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 21-12-2004 à 21:59:44    

Salut tout le monde,
 
J'aimerai empêcher le changement de mise en page de feuilles générées Excel par macro VBA. Les feuilles peuvent être des feuilles classiques ou des graphiques qui sont réalisées automatiquement.
 
J'ai fait une mise en page et je voudrais empêcher tout changement.
 
J'ai trouvé des codes pour empêcher l'impression mais pas le changement de mise en forme des pages.
 
Merci de vos réponses. :jap:  


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 21-12-2004 à 21:59:44   

Reply

Marsh Posté le 21-12-2004 à 23:02:39    

T'as une propriété Protected ou quelque chose comme ça pour un objet Sheet. Regarde dans la référence VBA pour Excel :)

Reply

Marsh Posté le 22-12-2004 à 09:11:59    

Voici ce que j'ai trouvé mais il n'y a rien pour empêcher la modification de la mise en page :

Code :
  1. .Protect(Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly)



---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 22-12-2004 à 09:18:09    

L'argument Contents protège la mise en page aussi, non ?
 
Sinon sous Excel 2003, y'a toutes ces options :

Code :
  1. .Protect(Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly, AllowFormattingCells, AllowFormattingColumns, AllowFormattingRows, AllowInsertingColumns, AllowInsertingRows, AllowInsertingHyperlinks, AllowDeletingColumns, AllowDeletingRows, AllowSorting, AllowFiltering, AllowUsingPivotTables)

Reply

Marsh Posté le 22-12-2004 à 09:30:17    

J'ai essayé

Code :
  1. sheet("mafeuille" ).protect Contents:=True

mais je peux modifier ma mise en page...
Ce serait quelle option pour Excel 2003 ?
 


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 22-12-2004 à 09:31:58    

Celles-là je pense :

Code :
  1. AllowFormattingCells, AllowFormattingColumns, AllowFormattingRows

Reply

Marsh Posté le 22-12-2004 à 09:39:33    

Je vais essayer mais je pense que cela ne correspond pas à ce que je souhaite.
Je fais une mise en page de feuille de calcul ou de graphe où je mets des données en entête et en pied de page pour impression.
Je souhaiterai que les personnes utilisant l'appli ne puissent pas modifier ces paramètres.
J'espère avoir été plus compréhensible...
Merci de ton intérêt...


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 22-12-2004 à 10:18:49    

Je peux modifier ma mise en page avec les options de protect...
Ca ne va pas, hélas...
Je crois que je vais me résoudre à reparamétrer la mise en page avant leur impression avec l'évènement Workbook_BeforePrint()...
 


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 22-12-2004 à 10:29:40    

pour que la protection de la feuille soit efficace, ne faut-il pas aussi proteger le classeur ???

Reply

Marsh Posté le 22-12-2004 à 10:32:57    

Je ne pense pas car avec la protection de la feuille, je ne peux pas modifier le contenu des cellules de la feuille.


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 22-12-2004 à 10:32:57   

Reply

Marsh Posté le 22-12-2004 à 11:10:48    

Bonjour,
Oui, il ne me semble pas qu'il y ait de meilleure solution.
Mais s'il y a plusieurs feuilles dans le classeur il faut que tu inclues une clause :
Select case ActiveSheet.Index
A+

Reply

Marsh Posté le 22-12-2004 à 12:31:56    

galopin01 a écrit :


Select case ActiveSheet.Index


Cela marche sans, mais à quoi cela sert ?
J'ai fait cela:

Code :
  1. Private sub Workbook_BeforePrint(cancel as boolean)
  2.     With ActiveSheet.PageSetup
  3.          .LeftHeader="..."
  4.          .CenterHeader="..."
  5.          .....
  6.     End With
  7. End Sub


J'ai rajouté d'autres choses pour connaître l'utilisateur et mettre son nom dans la mise en page...
 


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 22-12-2004 à 20:55:40    

Bonsoir,
Tu vas avoir cette mise en page pour TOUTES les pages du classeur
Si tu n'as qu'une seule page à contrôler une condition if suffit
 
If ActiveSheet.Name = "MaFeuilleAControler" Then
With ActiveSheet.PageSetup  
         .LeftHeader="..."  
         .CenterHeader="..."  
         .....  
End With  
End If
 
Bien sur si ton classeur ne comporte qu'une feuille imprimable ou si elles ont toutes la même mise en page la question ne se pose pas...
 
A+

Reply

Marsh Posté le 22-12-2004 à 21:28:56    

Merci.
 
En effet, je vais avoir la mise en page pour toutes les feuilles. Mais c'est ce que je souhaitais, donc c'est nikel.  :sol:  
 
Encore merci à tous le monde.  :jap:


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 23-12-2004 à 09:44:52    

C'est encore moi avec une autre question tordue...  :lol:  
 
Voilà, j'ai une macro de création de graphique qui s'exécue normalement, je mets en forme le graphique (axe, échelle,...) et lorsque je veux sauver mon travail, je fais appel à la fonction ActiveWorkbook.Save.
 
J'ai conditionné l'application pour qu'elle vérifie avant sauvegarde des "trucs" sur une feuille cachée ( :D ) (dans ThisWorkbook avec Workbook_BeforeSave).
 
La fonction de sauvegarde conditionnelle marche toute seule, mais lorsque je l'appelle dans ma macro de création de graphiques, elle ne marche plus car incapable de faire fonctionner le fonction suivante :

Code :
  1. Worksheets(mafeuille).Visible=True


J'ai tout fait pour voir ce qui ne vas pas. J'avais enlevé la mise à jour de l'écran pour ma fonction et je l'ai restauré avant l'appel de la sauvegarde => rien.
J'ai sélectionné une autre feuille que celle du graphe (feuille sélectionnée avant appel de la sauvegarde) pour voir si ce n'était pas la sélection du graphe qui empêchait de sauvegarder => rien.
 
N'y aurait il pas des limites pour ce genre de scénario de code ? J'ai d'ailleurs découvert que Excel ne permet pas de réaliser un graphe à partir d'une feuille ayant un nom trop long (plus de 20 caractères, je crois...).
 
Y a t'il quelqu'un qui a été confronté au même problème ?


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 23-12-2004 à 18:44:34    

Bonsoir,
Des guillemets peut-être (sinon il considère mafeuille comme une variable...)
Worksheets("mafeuille" ).Visible=True
A+

Reply

Marsh Posté le 23-12-2004 à 19:10:29    

Il y a bien des guillemets dans ma macro... Je me suis aperçu que dans d'autres macros faisant appel au Workbook.Save "conditionné", cela plante également. :sweat:  
Tant pis, il faut bien que l'utilisateur fasse au moins quelque chose. Charge sera à lui de sauver le travail que l'appli aura effectuée (à sa place  :lol: ).


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 23-12-2004 à 19:34:11    

j'ai eu ce genre de probléme aussi avec une feuille cachée, et c'etait justement le fait qu'elle soit cachée qui generait une erreur.
 
Apparement VBA n'aime pas qu'on execute des codes sur des feuilles qui sont cachées.
Tu la passe en visible avant d'executer le code qui s'y trouve ?
 

Reply

Marsh Posté le 23-12-2004 à 19:38:06    

ah ben je viens d'essayer et ca marche quand meme :D

Reply

Marsh Posté le 23-12-2004 à 20:28:31    

En fait, j'ai une feuille cachée qui stocke le nom de l'utilisateur. J'ai modifié le "ThisWorkbook" de manière à vérifier l'utilisateur avant l'enregistrement. Cela fonctionne lorsque je veux enregistrer (en cliquant sur la disquette par exemple).
Mais si je fais appel à la fonction Workbook.Save dans une macro, Excel tient compte de la sauvegarde "conditionnée", mais il n'arrive pas à décacher la feuille, et donc récupérer le nom de l'utilisateur...


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 23-12-2004 à 22:03:20    

Bonsoir,
Je ne pense pas.  
Visible ou non n'a rien à voir avec l'exécution d'une macro.
Tu n'as pas besoin de rendre une feuille visible pour connaitre le contenu d'une cellule : il suffit de faire  
Msgbox Worksheets("mafeuillecachée" ).Range("A1" ).Value  
...pour se rendre compte que le contenu reste accessible pour VBA.
Je pense plutôt à une autre erreur,classeur protégé par exemple ou appel d'une Private Sub?
En fait si j'ai bien compris tu essaies d'appeler Workbook_BeforeSave depuis une autre macro et celà ne PEUT pas marcher parce que Workbook_BeforeSave est Private
Aucune procédure évènementielle (Private Sub) ne devrait être appelée par une macro en tout cas elle ne PEUT pas être appelée à partir d'un autre module.
Sinon, as-tu un gestionnaire d'erreur? Il faudrait plutôt envisager un débogage. Pose un stop et effectue la zone de macro douteuse ligne par ligne avec F8 pour vérifier ce qu'il se passse.
Mais as-tu vraiment besoin de stocker le nom de l'utilisateur dans une feuille cachée? Une variable publique pourrait suffire...
A+


Message édité par galopin01 le 23-12-2004 à 22:04:07
Reply

Marsh Posté le 23-12-2004 à 22:36:13    

galopin01 a écrit :

Bonsoir,
Je ne pense pas.  
Visible ou non n'a rien à voir avec l'exécution d'une macro.
Tu n'as pas besoin de rendre une feuille visible pour connaitre le contenu d'une cellule : il suffit de faire  
Msgbox Worksheets("mafeuillecachée" ).Range("A1" ).Value  
...pour se rendre compte que le contenu reste accessible pour VBA.


En effet, je peux accéder sans "décacher" la feuille...

galopin01 a écrit :


Je pense plutôt à une autre erreur,classeur protégé par exemple ou appel d'une Private Sub?
En fait si j'ai bien compris tu essaies d'appeler Workbook_BeforeSave depuis une autre macro et celà ne PEUT pas marcher parce que Workbook_BeforeSave est Private
Aucune procédure évènementielle (Private Sub) ne devrait être appelée par une macro en tout cas elle ne PEUT pas être appelée à partir d'un autre module.


Je ne fais pas appel directement à Workbook_BeforeSave mais à Workbook.save... Mes modules sont tous privés et mes fonction ont des arguments factices pour éviter qu'on puisse les lancer comme on veut.

galopin01 a écrit :

Sinon, as-tu un gestionnaire d'erreur? Il faudrait plutôt envisager un débogage. Pose un stop et effectue la zone de macro douteuse ligne par ligne avec F8 pour vérifier ce qu'il se passse.


J'ai fait ce que tu as dit avant de poster mon problème et c'est là que j'ai vu qu'il exécute bien 'Worksheets("maFeuille" ).Visible = xlSheetVeryHidden' mais que cela n'a aucune action sur la feuille. Maintenant que je sais qu'on n'est pas obligé de "décacher" une feuille pour y accéder par VBA. Je pense que je pourrai me débrouiller autrement.

galopin01 a écrit :

Mais as-tu vraiment besoin de stocker le nom de l'utilisateur dans une feuille cachée? Une variable publique pourrait suffire...
A+


Je gère à la fois le nom d'utilisateur, le nom du fichier et son emplacement et une clé (xxxx-xxx-x...) donnée (pour l'utilisation de l'application).Je fais cela pour éviter que mon appli ne circule sans mon accord ou que si c'est le cas, cela se voit (voir mon problème de mise en page de feuille)


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 23-12-2004 à 23:29:30    

Encore Merci à tous,
 
J'ai pu résoudre le problème. Je peux donc faire appel à la fonction ActiveWorkbook.Save "conditionnée" même à partir d'une macro "private". Cela ne marchait pas car je décachais la feuille, que je sélectionnais la cellule de la feuille active (normalement la feuille qui se décache) et je prenais mes infos.
Maintenant, je prends mes infos directement. Cela m'évite des traitements et je gagne du temps d'exécution.
Merci encore
 :jap:   :jap:   :jap:  
 
Joyeux Noël à tous


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 23-12-2004 à 23:43:54    

Si ca peut t'aider ,pour supprimer temporairement l'evenement BeforeSave:
 

Code :
  1. Application.EnableEvents = False
  2. ThisWorkbook.Save
  3. Application.EnableEvents = True


 
Désactive les evenements avec EnableEvents en false puis remet en True aprés

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed