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

Macros et VBA Excel Discussion :

Commandbutton dans userform [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 300
    Par défaut Commandbutton dans userform
    Bonsoir au forum,

    Je viens ici en espérant trouver une aide. J’ai un userform qui se lance depuis un bouton dans la feuille excel.

    Ce userform comporte 360 commandbutton. Chaque commandButton.caption va de 0 à 360 crées à chaque ouverture du userform. Ils sont l’image des numéros dans la feuille excel en colonne F.
    Si ce numéro n’existe pas certains commmandbutton ont un fond grisés et sinon un fond uniforme en violet. Pour l’instant j’arrive à faire cela.

    Mon problème commence ici : voyant les commandbutton en « violet » je voudrais lorsqu’on clique dans l’un d’eux hé bien ouvrir une nouvelle userform affichant des infos provenant d’une autre feuille.

    1/ J’ai une solution barbare qui est du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private sub commanbutton1_click()
    Effectuer ma routine1
    End sub
     
    Private sub commanbutton2_click()
    Effectuer ma routine2
    End sub
     
    …
     
    Private sub commanbutton360_click()
    Effectuer ma routine360
    End sub
    2/ Je pourrai détecter un clic souris dans le userform mais je ne sais guère m’y prendre à gérer l’événement souris + a priori une histoire de focus

    3/ Ou alors y a-t-il mieux que cela ?

    J’en appelle donc à votre aide précieuse.
    Je vous en remercie par avance.

    Ci-dessous une image pour se représenter (ne pas tenir compte au-delà du 360eme)
    Images attachées Images attachées  

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir
    par expérience 360 bouton/360 routines il y a la soucis de conception je suis quasi certain qu'il y a plus simple

    mais bon
    après leur évènement click bien entendu la on entre parfaitement dans le cadre d'un module classe surtout si effectivement ces boutons sont ajoutés a l'ouverture du UserForm
    montre le code de création

    un exemple ci joint
    UserForm avec créations dynamique 360 boutons avec gestion click dans module classe et appel de leur routine respective
    ca fait un peu to much quand même
    Fichiers attachés Fichiers attachés
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 300
    Par défaut
    PatrickToulon, merci pour l’intervention.

    Demain je poste mes lignes de code.
    Et en regardant à nouveau l’image, je ne cherche pas à un faire démineur mais presque 😀

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    regarde mon post j'ai mis un exemple basique avec module classe
    ca te donne un appercu
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 300
    Par défaut
    Bonjour PatrickToulon,

    voici mon code brouillon.
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Private Sub tableau_Initialize()
    Dim comand As Object
    Dim i As Integer
    Application.ScreenUpdating = False
    i = 0
    compteur = -1 'compteur sert à compter le nombre d'élément qui ont le meme numéro dans la colonne F
     
    For Each comand In Me.Controls
     If comand.Name Like "CommandButton*" Then
     comand.Caption = CStr(1000 + i) 'renomme les éléments commandbutton en commençant par 1000
     i = i + 1
     
     Sheets(1).Range("B8", Sheets(1).Range("Q" & Rows.Count).End(xlUp)).Select 'mets un filtre selon 1 critere donne par combobox1
        Selection.AutoFilter
        chaine1 = comand.Caption
        ActiveSheet.Range("B8", Sheets(1).Range("J" & Rows.Count).End(xlUp)).AutoFilter Field:=5, Criteria1:=chaine1
     
     
    'trouve la ligne correspondant a l element donne par le filtre
        For Each cell In ActiveSheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible)
        compteur = compteur + 1 'si le compteur est >1 alors il a trouvé compteur de fois l'élément dans la colonne "F"
        Next cell
     
     If compteur = 0 Then comand.Enabled = False
     If compteur > 0 Then
     comand.ForeColor = &HFFFFFF
     comand.BackColor = &H800080
     End If
     
     'enleve les filres
     Selection.AutoFilter
     
     End If
     compteur = -1
     Next
    Application.ScreenUpdating = True
     
    'retire la selection en te poistionnant en A1
    Cells(1, 1).Select
     
    End Sub
     
     
     
    Private Sub UserForm_Initialize()
    Call tableau_Initialize
    End Sub
    Merci pour le code, mais il va falloir 1 mois pour comprendre comment il est construit... mais ça y ressemble fortement.

  6. #6
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Bonjour, juste une question?
    Plutôt que de créer 360 boutons qui correspondent aux 360 numéros s'ils sont disponibles, j'aurais mis une liste avec les 360 numéros, du moins les disponibles. le codage en serait infiniment moins complexe. mais sous réserve que cela soit possible. A réfléchir?
    Enfin moi ce que j'en dit
    Cordialement

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    salut
    Nom : Capture.JPG
Affichages : 2150
Taille : 246,9 Ko
    Fichiers attachés Fichiers attachés
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 300
    Par défaut
    Bonjour à tous,
    Transitoire et PatrickToulon merci pour votre aide

    @Transitoire : je n'ai pas saisis vos propos. j'ai un listing en colonne F des numéros dont il peut y avoir des doublons, triplets... je n'affiche que le numéro sans doublons dans un caption de son commandbutton après je sais qu'il y en a pour l'instant 360. Pouvez-vous reformuler pour que je comprenne mieux SVP ?

    @PatrickToulon: mon problème est bien cerné, mais je vois "360" routines. Je voulais éviter cela et c'était la solution barbare.
    le commandbutton.name est la variable a récupérer. dans classe je n'ai rien compris sur le userform dois-je utiliser userform dans fonction + méthode de cette classe ?

    Dans tous les cas merci à vous deux.

  9. #9
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Bonsoir, je vais donc essayer de reformuler.
    A lieu d'avoir 360 boutons sur un Userform, ce qui me semble une horreur. pourquoi ne pas présenter les 360 possibilités sous forme d'une liste au sein d'une listbox qui permettrait d'avoir un Userform a "taille humaine". Vous pourriez ainsi choisir au sein de la liste l'élément de la dite liste qui vous convient. Au vu du peu d'informations dont je dispose, je ne peut pas développer plus. Vous pourriez avoir une liste de deux colonnes si nécessaire et lancer la routine en fonction du numéro choisi. Vous pourriez même si besoin avoir une listbox a multiple choix.
    J'espère que vous avez compris ce que je désire vous expliquer.
    Cordialement

  10. #10
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 300
    Par défaut
    Bonsoir,

    La listbox n’a pas la même présentation que les 360 boutons. La listbox pour 360 éléments il faudra défiler vers le bas ou le haut pour voir la totalité sans avoir de notion de volume entre un numero actif d’un numero passif et de début et de fin.

    Tandisque les 360 commanboutons je les vois d’un coup d’oeil. Si en plus ils sont coloriés montrant l’ accés ou pas à de l’information, visuellement il me semble le plus approprié/intuitif/visuel.

    PatrickToulon a mis dans son dernier post l’image obtenue. On aperçoit de suite ceux qui ont de l’info (ici en violet) de ceux qui n’en ont pas.

    C’est un peu comme des cellules mémoires, clusters, ect. Je m’oriente vers cette solution.

  11. #11
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Si c'est pour construire 360 routines dans un module standard appelées par le module de classe plutôt que 360 routines dans le userform, ça n'a strictement aucun intérêt, évidemment

    Il faudrait savoir ce qui doit être réalisé lors d'un clic sur le bouton pour pouvoir créer un code générique à utiliser quel que soit le bouton.

    La question est: Que dois-tu réaliser lors d'un clic sur un bouton?
    "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...
    ---------------

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    @PatrickToulon: mon problème est bien cerné, mais je vois "360" routines. Je voulais éviter cela et c'était la solution barbare.
    c'est ce que je voulais dire par plus simple
    dans mon exemple un seul code évènement click gère les 360 boutons (c'est dans la classe)
    j'ai quand même mis tes 360 routine mais tu peux selon ce que tu veux faire ,tout gérer en une
    mais pour savoir il faudrait t'expliquer sur ce point
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    [...]
    dans mon exemple un seul code évènement click gère les 360 boutons (c'est dans la classe)
    j'ai quand même mis tes 360 routine mais tu peux selon ce que tu veux faire ,tout gérer en une [...]
    Dans l'exemple que tu donnes, tu illustres effectivement qu'un seul événement gère le click sur les 360 boutons, mais ton code oblige bien l'écriture de 360 routines dans un module standard Application.Run "routine" & Replace(bouton.Name, "bt", ""), ce qui est une ineptie sans nom, évidemment, qui ne fait rien gagner en termes de production de code, alors que c'est justement la question du demandeur
    "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...
    ---------------

  14. #14
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    je repete donc
    j'ai quand même mis tes 360 routine mais tu peux selon ce que tu veux faire ,tout gérer en une
    mais pour savoir il faudrait t'expliquer sur ce point
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #15
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Ca doit être cela "apprendre la programmation par l'absurde"...
    "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...
    ---------------

  16. #16
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Bonjour
    La listbox n’a pas la même présentation que les 360 boutons. La listbox pour 360 éléments il faudra défiler vers le bas ou le haut pour voir la totalité sans avoir de notion de volume entre un numero actif d’un numero passif et de début et de fin.
    Tandisque les 360 commanboutons je les vois d’un coup d’oeil. Si en plus ils sont coloriés montrant l’ accés ou pas à de l’information, visuellement il me semble le plus approprié/intuitif/visuel.
    PatrickToulon a mis dans son dernier post l’image obtenue. On aperçoit de suite ceux qui ont de l’info (ici en violet) de ceux qui n’en ont pas.
    C’est un peu comme des cellules mémoires, clusters, ect. Je m’oriente vers cette solution.
    D'accord, C'est votre choix et il semble répondre à des raisons pratiques. Je vous souhaite bonne route, ou peut être bonnes routines
    Cordialement

  17. #17
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 300
    Par défaut
    bonjour,
    merci merci...

    oui c'est une question de visuel @sir transitoire.

    Par contre je ne veux pas particulièrement que vous me fassiez tout le code. j'ai oublié de préciser que ma première photo des 360 boutons je les ai dessinés "à la main" contrairement à toi Patrick tu les as généré.

    Mais pour répondre @Fauconnier, voilà
    lorsque tu as les 360 bouttons, tu cliques dans l'un d'eux (actif par la couleur) car il y a de l'information à récupérer. En cliquant dedans, cela t'ouvre une nouvelle userform dans lequel il y a aura des textbox. le champ des textbox sont issus de différentes colonnes de la feuille1 correspondant à la ligne donnée par le numéro du commandboutton. en plus il faudra prendre la ligne la plus récente car il y a des doublons ... un bouton activeX est inséré sur la feuille1 permettant d'insérer à chaque demande de saisie une ligne et fait "descendre" les anciennes lignes.

    donc du coup soit je fais comme je l'ai dis dans mon premier post :

    private sub commandbutton1_click()
    recherche avec le commandbutton1.name le numéro de ligne dans la base de données de la feuille1
    assure toi que j'ai le dernier saisi et non pas celui qui a été saisi il y a 1 mois
    Puis prend les valeurs dans différentes colonnes de cette ligne
    Mets les dans un tableau
    ouvre ensuite une nouvelle userform
    remplit les champs grace au tableau
    end sub

    private sub commandbutton2_click()
    recherche avec le commandbutton2.name le numéro de ligne dans la base de données de la feuille1
    assure toi que j'ai le dernier saisi et non pas celui qui a été saisi il y a 1 mois
    Puis prend les valeurs dans différentes colonnes de cette ligne
    Mets les dans un tableau
    ouvre enuite une nouvelle userform
    remplit les champs grace au tableau
    end sub

    ....

    private sub commandbutton360_click()
    recherche avec le commandbutton360.name le numéro de ligne dans la base de données de la feuille1
    assure toi que j'ai le dernier saisie et non pas celui qui a été saisi il y a 1 mois
    Puis prend les valeurs dans différentes colonnes de cette ligne
    Mets les dans un tableau
    ouvre enuite une nouvelle userform
    remplit les champs grace au tableau
    end sub

    car mon niveau ne me permet de faire que cela.

    soit il y a une procédure générique plus simple.

    est-ce que mon problème est plus clair ?

  18. #18
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Tout dépend de comment sont organisées tes données, sur quel support, ...

    Nous nous doutons bien que les boutons doivent produire le même résultat avec des données différentes, mais sans savoir ce qu'il faut aller chercher et où, nous ne pourrons t'être d'aucune aide...

    On peut supposer que tu as des données dont la clé est le numéro du bouton, mais au delà, on ne va pas produire du code sur base d'hypothèses.
    "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...
    ---------------

  19. #19
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Voici un exemple qui modélise ce que tu souhaites obtenir

    1. Créer un module de classe pour gérer les événements des boutons dynamiques. Je l'ai appelé DynamicButton. On remarque que cette classe gère l'événement du bouton reçu grâce à Init. Init reçoit aussi le userform et, surtout, le nom de la procédure CallBack qui sera appelée lors du clic sur un bouton. Cette procédure doit recevoir le userform et le bouton en arguments (le userform n'est pas obligatoire ici, mais je l'ajoute à ce genre de process car cela peut servir ultérieurement => code générique).
    Code vba : 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
     
    Private WithEvents mButton As MSForms.CommandButton
    Private mCallBackFunction As String
    Private mUsf As MSForms.UserForm
     
    Public Function Init(usf As MSForms.UserForm, Button As MSForms.CommandButton, CallBackFunction As String) As DynamicButton
      Set mUsf = usf
      Set mButton = Button
      mCallBackFunction = CallBackFunction
      Set Init = Me
    End Function
     
    Private Sub mButton_Click()
    Run mCallBackFunction, mUsf, mButton
    End Sub

    2. Créer un userform1. Dans mon exemple, il ne contient aucun contrôle, les boutons étant ajoutés dynamiquement. Il contient le code suivant, dans lequel:
    • on déclare la collection des boutons dynamiques;
    • on crée une fonction qui ajoute le bouton dont les caractéristiques sont reçues en arguments.



    Code vba : 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
     
    Dim Buttons As New Collection
     
    Public Sub AddButton(Name As String, Caption As String, Top As Long, Left As Long, Width As Long, Height As Long)
      Dim Button As MSForms.CommandButton
      Dim Item As New DynamicButton
     
      Set Button = Me.Controls.Add("Forms.CommandButton.1", Name, True)
      With Button
        .Caption = Caption
        .Top = Top
        .Left = Left
        .Height = Height
        .Width = Width
      End With
      Buttons.Add Item.Init(Me, Button, "ButtonClick")
    End Sub

    3. Dans un module standard, on crée les procédures suivantes:
    Test, qui appelle la procédure qui crée les boutons à la volée puis affiche le userform;
    AddButtons, procédure qui crée les boutons en boucle sur base d'un tableau structuré;
    ButtonClick, procédure Callback qui sera appelée lors du clic sur un des boutons dynamiques (normalement, le test d'existence du bouton dans la plage n'est pas nécessaire).
    Code vba : 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
    32
    33
    34
    35
    36
    37
    38
    39
    Option Explicit
     
    Sub Test()
      With UserForm1
        AddButtons
        .Show
      End With
    End Sub
     
    Sub AddButtons()
      Dim Cell As Range
      Dim Top As Long
     
      Top = 10
      For Each Cell In Range("tableau1[bouton]")
        UserForm1.AddButton Cell.Value, Cell.Value, Top, 10, 20, 20
        Top = Top + 30
      Next
    End Sub
     
    Sub ButtonClick(usf As MSForms.UserForm, Button As MSForms.CommandButton)
      Dim Formula As String
      Dim Index As Long
      Dim Row As Range
     
      Formula = "iferror(match(""" & Button.Name & """,tableau1[bouton],0),0)"
      Index = Evaluate(Formula)
      If Index <> 0 Then
        Set Row = Range("tableau1").ListObject.ListRows(Index).Range
        With UserForm2
          .tboButton.Value = Row(1)
          .tboFirstName.Value = Row(2)
          .tboLastName.Value = Row(3)
          .Show
        End With
      Else
        MsgBox "Donnée inexistante"
      End If
    End Sub

    4. On crée un userfom (ici, Userform2) qui contient les contrôles destinés à recevoir les infos spécifiques après clic sur un bouton (ici, tboButton, tboFirstName, tboLastName)

    5. Dans une feuille du classeur, on crée une table de données (ici, Tableau1) contenant les infos qui serviront:
    • à créer les boutons dynamiques;
    • à récupérer les infos qui seront envoyée dans le userform2.




    Fonctionnement:
    La classe DynamicButton permet de placer un listener (écouteur) sur l'événement du bouton qu'on lui passe lors de l'init. Le userform, lors de la création de chaque bouton, ajoute l'élément DynamicButton créé à sa collection de boutons dynamiques. Chaque élément DynamicButton ajouté à la collection contient le nom de la procédure Callback qui sera appelée lorsque l'on cliquera sur le bouton intégré à l'élement DynamicButton. buttonClick récupère le bouton en argument, et peut donc retrouver la ligne correspondante dans le tableau structuré pour récupérer les données des colonnes dudit tableau et les envoyer sur les textbox du userform2.

    DynamicButton est donc une classe générique qui peut être utilisée chaque fois que tu as besoin de créer des boutons dynamiques, dans des projets différents mais également avec des userforms différents du même classeur.

    Il s'agit ici d'une modélisation de ce qu'il y a lieu de mettre en place. A toi d'adapter à ton besoin spécifique.
    Fichiers attachés Fichiers attachés
    "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...
    ---------------

  20. #20
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 300
    Par défaut
    Bonjour,

    Merci M.Fauconnier pour votre contribution je n’en demandais pas autant. Je vais étudier tout cela puis adapter. Je reviens vers vous pour dire. Et merci pour les explications.

    Dans tous les cas merci !
    Ce passage j’ai du mal à le comprendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Buttons.Add Item.Init(Me, Button, "ButtonClick")

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel d'un module par CommandButton dans un Userform
    Par poulette17 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/02/2013, 18h24
  2. [XL 2003] position CommandButton dans UserForm
    Par guichedlm dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/12/2010, 12h28
  3. [VBA-E] affichage de données dans userform
    Par lio62 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 05/02/2007, 21h52
  4. (VBA-E) Problème combobox dans userform
    Par gringo69 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/06/2006, 18h28
  5. [JFRAME]-[DEBUTANT] Placer un CommandButton dans un JFrame
    Par Hoegaarden dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 19/12/2005, 15h22

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