Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Général VBA > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, faq, codes sources, astuces pour VBA
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 28/12/2006, 19h57   #1
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 199
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 199
Points : 14 398
Points : 14 398
Envoyer un message via Skype™ à Pierre Fauconnier
Par défaut Savoir sur quel bouton créé dynamiquement l'utilisateur a cliqué

[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:
Code :
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
Construction de la classe "cBouton"

Créer un nouveau module de classe et y coller le code suivant:
Code :
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
Comment fonctionnent ces classes?

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
Code :
1
2
3
4
5
 
Sub init(Bouton As CommandBarButton, Parent As cBoutons)
    Set mBouton = Bouton
    Set mParent = Parent
End Sub
permet d'instancier un parent de type cBoutons pour pouvoir modifier la valeur de sa propriété Parametre.

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
Code :
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
Pour comprendre comment cela fonctionne, il faut démarrer pas à pas sur la procédure d'ajout de boutons.

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
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2006, 22h14   #2
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 854
Points : 16 854
Envoyer un message via Skype™ à bbil
Bonsoir, Pierre...
je suis pas sur que cette contribution soit à supprimer on manque d'exemples sur l'utilisations des classes....

bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2006, 22h17   #3
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 199
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 199
Points : 14 398
Points : 14 398
Envoyer un message via Skype™ à Pierre Fauconnier
Salut

Ok. Je peux l'étoffer un peu ou la détailler.
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2006, 22h24   #4
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 854
Points : 16 854
Envoyer un message via Skype™ à bbil
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2006, 12h04   #5
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 675
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 675
Points : 7 648
Points : 7 648
Citation:
Envoyé par Pierre Fauconnier
[EDIT] Proposition à supprimer car solution de Silkyroad beaucoup plus simple. Merci[EDIT]
Si tu nous disais laquelle, on pourrait se faire une idée...

Edit -> J'ai trouvé, c'est .

Vu le commentaire de SilkyRoad, je pense qu'il vaut mieux garder cette contribution.
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2009, 18h38   #6
Invité de passage
 
Inscription : juillet 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 5
Points : 1
Points : 1
Merci pour ce post, ça fait plus d'un mois que je cherche une solution a ce pb avec outlook, j'avais entrepris de faire un COM ADDIN, mais la ça marche super.

Merci encore.
cik31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/08/2009, 17h12   #7
Membre Expert
 
Inscription : avril 2006
Messages : 1 050
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 050
Points : 1 230
Points : 1 230
Bonjour,

je ne comprends pas là. Un simple CommandBars.ActionControl ne suffit-il pas ?
ilank est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 11h59   #8
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 75
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 75
Points : 27
Points : 27
Citation:
Envoyé par AlainTech Voir le message
Si tu nous disais laquelle, on pourrait se faire une idée...

Edit -> J'ai trouvé, c'est .

Vu le commentaire de SilkyRoad, je pense qu'il vaut mieux garder cette contribution.
Bonjour, j'essaye de réaliser les boutons dynamiquement, et dans cette conversation, vous avez cité la solution de SilkyRoad comme étant plus simple, mais le lien fourni semble ne plus marcher... est-ce normal?
candrau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 12h54   #9
Responsable Access
 
Avatar de Arkham46
 
Inscription : septembre 2003
Messages : 4 300
Détails du profil
Informations personnelles :
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : septembre 2003
Messages : 4 300
Points : 7 938
Points : 7 938
bjr,

Citation:
Envoyé par candrau Voir le message
Bonjour, j'essaye de réaliser les boutons dynamiquement, et dans cette conversation, vous avez cité la solution de SilkyRoad comme étant plus simple, mais le lien fourni semble ne plus marcher... est-ce normal?
c'est sans doute passer dans la faq ici :
http://excel.developpez.com/faq/inde...arButtonClique
__________________
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL

Blog Office Mon Site DVP
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h20.


 
 
 
 
Partenaires

Hébergement Web