Empêcher la modif d'une BO perso
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 : ChrisV
Mots clefs associés à cette page : barre, outil, bouton
- Vous devez vous identifier ou créer un compte pour écrire des commentaires
