Empêcher la modif d'une BO perso

Comment faire pour mettre un bouton Macro dans un classeur? Si il y a plusieurs feuilles faut-il le mettre sur chaque feuille? Si je copie la feuille, est-ce que ça copie le bouton??

Si le bouton Macro doit déclencher la même procédure pour chaque feuille de ton classeur, une icône attachée à une barre d'outil personnalisée et associée à ton code serait sans doute plus commode. La B.O. restera en effet visible pour toutes les feuilles existantes ou nouvelles de ton classeur.

- OUI MAIS... Si je le met dans la barre outil, il sera présent sur toutes les feuilles de mon classeur mais également sur tous les classeurs que j'ouvrirais sur ce PC (et je devrais en créer un autre si je veux changer de PC)! Là est mon probleme car suivant le classeur j'ai des macros differentes. En revanche pour chaque feuille d'un meme classeur j'ai les memes!

Pourtant, je pense aussi qu'une barre d'outils personnalisée serait une bonne solution à ton problème. Pour tenir compte de toutes tes contraintes, on peut créer et gérer l'affichage d'une barre d'outils par programmation et obtenir exactement ce que tu souhaites.
Marche à suivre : Dans un module standard du classeur qui doit utiliser la barre d'outils, tu écris une procédure pour créer la barre d'outils, avec le nombre de boutons correspondant au nombre de macros à lancer. L'attribution d'une macro à un bouton s'effectue en affectant le nom de la macro à la propriété OnAction du bouton.
Puis tu écris une procédure pour détruire la barre d'outils.
Par exemple, pour créer et détruire une barre d'outils avec deux boutons qui lancent les macros Macro1 et Macro2 : "

 
dans un module standard Public Const nomBO = "MaBarreOutilssub CreateBO()
 Dim bo As CommandBar
 On Error Resume Next
 DeleteBO 'en cas de plantage d'Excel :-)
 
 Set bo = Application.CommandBars.Add(nomBO)
 With bo.Controls.Add(msoControlButton)
 .Caption = "LanceMacro1"
 .FaceId = 232
 .OnAction = "Macro1"
 End With
 With bo.Controls.Add(msoControlButton)
 .Caption = "LanceMacro2"
 .FaceId = 348
 .OnAction = "Macro2"
 End With
 bo.Visible = True
 end sub
sub DeleteBO()
 On Error Resume Next
 Application.CommandBars(nomBO).Delete
 end sub

Le plus difficile est fait ! Il ne reste plus qu'à appeler ces deux procédures à l'ouverture du classeur (pour créer la barre d'outils) et à la fermeture (pour la détruire), et à la rendre visible ou invisible selon que le classeur est actif ou non, en utilisant les événements du module ThisWorkbook du classeur. Ceci afin d'éviter les inconvénients que tu décris. Ça donne ceci, avec la barre d'outils créée plus haut :
dans le module ThisWorkbook du classeur

Private sub Workbook_BeforeClose(Cancel As Boolean)
 DeleteBO
 end sub
Private sub Workbook_Open()
 CreateBO
 end sub
Private sub Workbook_WindowActivate(ByVal Wn As Window)
 Application.CommandBars(nomBO).Visible = True
 end sub
Private sub Workbook_WindowDeactivate(ByVal Wn As Window)
 Application.CommandBars(nomBO).Visible = False
 end sub

Avec cette méthode, pas de problème non plus pour utiliser ton classeur et ses macros sur un autre PC...

Auteur :

Mots clefs associés à cette page : , ,