IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Savoir sur quel bouton créé dynamiquement l'utilisateur a cliqué


Sujet :

Contribuez

  1. #1
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    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 : 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
    Construction de la classe "cBouton"

    Créer un nouveau module de classe et y coller le code suivant:
    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
    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 : 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
    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 : 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
    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)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Bonsoir, Pierre...
    je suis pas sur que cette contribution soit à supprimer on manque d'exemples sur l'utilisations des classes....


  3. #3
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut

    Ok. Je peux l'étoffer un peu ou la détailler.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut

  5. #5
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    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!

  6. #6
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    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.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,

    je ne comprends pas là. Un simple CommandBars.ActionControl ne suffit-il pas ?

  8. #8
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2011
    Messages : 81
    Points : 58
    Points
    58
    Par défaut
    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?

  9. #9
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 524
    Points
    14 524
    Par défaut
    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

Discussions similaires

  1. Savoir sur quel bouton l'utilisateur a cliqué
    Par yearling05 dans le forum VBScript
    Réponses: 1
    Dernier message: 11/01/2011, 20h43
  2. Savoir sur quel bouton l'utilisateur a cliqué
    Par l_seringa dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/05/2008, 00h36
  3. savoir sur quel bouton l'utilisateur clique
    Par Mihalis dans le forum Delphi
    Réponses: 4
    Dernier message: 13/06/2007, 21h07
  4. [WinForms]comment savoir sur quel bouton j'ai cliqué?
    Par bossun dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 14/03/2006, 14h18
  5. Formulaire -> pour savoir sur quel bouton on a cliqué.
    Par Thierry8 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/09/2005, 18h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo