[EDIT] Proposition à supprimer car solution de Silkyroad beaucoup plus simple. Merci[EDIT]
Bonjour
Je peux proposer ce qui suit, soit en code source, soit (et cela me semble préférable), en article. Si cela est accepté, j'étofferai et commenterai davantage.
Contexte
Créer des boutons dynamiquement et leur affecter la même macro, puis pouvoir déterminer sur quel bouton l'utilisateur a cliqué dans le traitement de la macro spécifiée sur le OnAction du bouton
Utilité
Dans l'exemple sur le forum, l'intervenant souhaitait créer des boutons sur une barre d'outils pour permettre une navigation dans les onglets.
L'idée était de créer les boutons, de leur affecter une même macro, et d'identifier dans la macro le bouton cliqué pour activer la feuille correspondante.
La solution que je propose fait intervenir deux classes, la classe cBoutons et la classe cBouton.
Construction de la classe cBoutons
Créer un nouveau module de classe et le nommer "cBoutons", puis y coller le code suivant:
Construction de la classe "cBouton"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Option Explicit Private mBouton As cBouton Private mCol As Collection ' contiendra la collection de boutons créés Public Parametre As String ' renverra le paramètre du bouton cliqué Private Sub Class_Initialize() Set mCol = New Collection ' instancie la collection End Sub Sub Add(Bouton As CommandBarButton) ' Ajoutera le bouton dans la collection pour permettre ' de gérer son évènement Click Set mBouton = New cBouton mBouton.init Bouton, Me ' créera un parent pour le bouton mCol.Add mBouton ' ajoute le bouton créé End Sub
Créer un nouveau module de classe et y coller le code suivant:
Comment fonctionnent ces classes?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Option Explicit ' WithEvents permet de gérer le clic sur le bouton Private WithEvents mBouton As CommandBarButton Private mParent As cBoutons ' contient le parent de cbouton, soit cboutons Private Sub mBouton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean) ' Passe la propriété Parameter du bouton cliqué à son parent mParent.Parametre = Ctrl.Parameter End Sub Sub init(Bouton As CommandBarButton, Parent As cBoutons) Set mBouton = Bouton ' permettra d'envoyer au parent le paramètre du bouton cliqué Set mParent = Parent End Sub
Lorsque l'on ajoute un élément à l'instance de la classe cBoutons, un nouvel élément de type cBouton est créé et initialisé puis ajouté à la collection privée déclarée dans cBoutons.
L'initialisation du bouton
permet d'instancier un parent de type cBoutons pour pouvoir modifier la valeur de sa propriété Parametre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Sub init(Bouton As CommandBarButton, Parent As cBoutons) Set mBouton = Bouton Set mParent = Parent End Sub
Dans un module standard, il faut déclarer en haut de module une nouvelle instance de notre classe cBoutons.
Lors de l'ajout d'un bouton, on l'ajoute à l'instance cBouton créée.
Il suffira alors de récupérer la "propriété" Parametre de l'instance de cBoutons dans la procédure spécifiée pour le OnAction du bouton
Cela donnera quelque chose du genre, dans un module standard
Pour comprendre comment cela fonctionne, il faut démarrer pas à pas sur la procédure d'ajout de boutons.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 Option Explicit Public Boutons As cBoutons Sub AjoutBouton() ' Ajoute des boutons sur la barre nommée "Barre" ' en fonction du nombre de feuilles Dim Barre As CommandBar Dim Bouton As CommandBarButton Dim sh As Worksheet Set Boutons = New cBoutons ' Instanciation de cBoutons Set Barre = CommandBars("Barre") For Each sh In ThisWorkbook.Worksheets ' Enumération des feuilles du classeur Set Bouton = Barre.Controls.Add(msoControlButton, , , , True) With Bouton .Parameter = sh.Name ' Recoit le nom de la feuille .Caption = sh.Name ' Le texte du bouton = nom de la feuille .Style = msoButtonCaption ' Permet de voir le texte du bouton .OnAction = "test" ' Procédure appelée sur le click End With Boutons.Add Bouton ' Ajout du bouton l'instance cBoutons créée Next sh End Sub Sub Test() ' Procédure appelée lors du clic Worksheets(Boutons.Parametre).Select ' Utilisation du paramètre du bouton cliqué End Sub
La collection de boutons de la classe cBoutons permet d'instancier autant de cBouton qu'il y a de feuilles dans le classeur. Ainsi, chaque bouton existe dans la collection et on peut donc gérer l'évènement Click du bouton, grâce à la déclaration "WithEvents" du bouton dans cBouton.
J'espère que cela pourra être utile. Je vous remercie pour tout retour constructif sur ce message et cette proposition de collaboration
Partager