[VBA] : Un bouton dans userform dynamique n'a plus d'action

Résolu
anton26 Messages postés 33 Statut Membre -  
piopicolo Messages postés 1422 Statut Membre -
Bonjour,

J'ai une userform dynamique où l'on rentre des noms. Afin d'afficher ces noms dans une feuille, j'ai ajouté un bouton valider. Si j'ajoute ce bouton directement sur le userform, cela fonctionne. Lorsque je crée un bouton dynamiquement (le bouton se met automatiquement en bas de la page en fonction du nombre de noms a rentrer) il n'a plus aucun effet. Quelqu'un aurait-il une solution à mon problème ?

Merci d'avance

2 réponses

  1. Yoda
     
    Bonjour anton26,

    Dans ton cas il serait préférable de placer le CommandButton sur le Userform tout de suite avec le code qui va bien. En effet pour un seul bouton c'est pas la peine d'utiliser la création dynamique.

    Quand tous les TextBox dynamiques sont en place, il suffit de déplacer le bouton au bon endroit en jouant sur les propriétés .Left et .Top

    Mais si tu dois créer un nombre de boutons non connu d'avance, alors oui il faut passer par création dynamique. Pour ça tu dois apprendre à maitriser les Classes et les Collections. J'aurais un exemple simple si tu veux.

    A plus tard.
    3
    1. anton26 Messages postés 33 Statut Membre
       
      En effet Yoda je ne connais pas le nombre de textbox a créer d'avance. Cela peut aller de 1 à plus de 100. C'est pour cela que je souhaitais utiliser la création d'un bouton dynamique afin que le bouton se place automatiquement en bas a coté du dernier textbox.
      C'est vrai que je ne maîtrise ni les classes ni les collections donc je vais peut être me limiter à un bouton simple. Je veux bien tout de même voir ton exemple si jamais je le comprends.

      Merci
      0
    2. Yoda
       
      Ok,

      Pour l'exemple, tu ouvres un nouveau classeur, tu actives Visual basic Editor (Alt F11)

      Tu inseres un UserForm, nommé UserForm1,dans le code de UserForm1 tu copies ce code:

      Option Explicit
      Public Collect As Collection
      Public CollectBT As Collection
      
      Private Sub UserForm_Initialize()
      Dim Bouton As MSForms.CommandButton
      Dim Cl As ClasBT
      
      Set Collect = New Collection
      Set CollectBT = New Collection
      
                  Set Bouton = Me.Controls.Add("Forms.CommandButton.1", "Bt1", True)
                  CollectBT.Add Bouton, "1"  'Ajouter à la collection d'objet
                  Set Cl = New ClasBT 'Ajouter à la collection de classe
                  Set Cl.GroupBoutons = Bouton
                  Collect.Add Cl
                 
                  With CollectBT("1") 'Initialise les boutons
                  .Top = 20
                  .Left = 30
                  .Caption = "OK"
                  .Tag = 1
                  End With
                  
                  
                  Set Bouton = Me.Controls.Add("Forms.CommandButton.1", "Bt2", True)
                  CollectBT.Add Bouton, "2"  'Ajouter à la collection d'objet
                  Set Cl = New ClasBT 'Ajouter à la collection de classe
                  Set Cl.GroupBoutons = Bouton
                  Collect.Add Cl
                  
                  With CollectBT("2") 'Initialise les boutons
                  .Top = 60
                  .Left = 30
                  .Caption = "Cancel"
                  .Tag = 2
                  End With
                  
          
      End Sub
      
      Public Sub ControlClick(nom As String, num As Long)
      MsgBox "Bouton " & nom & " appuyé"
      
      Select Case num
      Case 1
         MsgBox "Procédure validée"
      Case 2
         MsgBox "Procédure annulée"
         End
      End Select
      
      End Sub


      Maintenant tu inseres un nouveau module de classe, que tu appelleras ClasBT. Par défaut ça met Classe1 mais tu peux changer dans les propriétés.

      Dans ce module ClasBT tu colles ce code

      Option Explicit
      
      Public WithEvents GroupBoutons As MSForms.CommandButton
      
      Private Sub GroupBoutons_Click()
          
          Call UserForm1.ControlClick(GroupBoutons.Caption, GroupBoutons.Tag)
         
      End Sub


      Affiches Userform1 et tu verras deux boutons qui réagissent au clic.

      Voilà, j'ai chiné sur le net et j'ai fini par dénicher cet exemple, enfin j'ai simplifié au maximum.
      Regardes si tu arrives à décoder et à adapter à ton projet

      A+.
      0
    3. anton26 Messages postés 33 Statut Membre
       
      Merci Yoda. J'ai en effet essayé de décoder au mieux ton exemple. J'ai remplacé l'affichage d'une msgbox par l'affichage de mes valeurs dans la feuille excel et ça fonctionne parfaitement !
      Je vais commencer a appréhender les classes.

      Merci et encore bonnes fêtes !
      0
  2. piopicolo Messages postés 1422 Statut Membre 200
     
    Bonjour,
    J'ai de temps en temps ce genre de problème parce que VBA contrairement à EXCEL ne suit pas correctement les changements des Userform.
    Cela arrive quand je copie dans le "Userform" une autre forme (bouton, liste, etc....) Je ne sais pas pourquoi mais VBA ne crée pas le lien et quand j'affiche mon Userform, le bouton est inactif ou apparaît ailleurs.
    Bref, dans ce cas, j'efface l'objet inactif et en recrée un depuis la boîte outils
    Je peux alors copier le programme de l'objet dans le nouvel objet et çà marche.
    Je ne sais pas si c'est ton cas mais tu peux essayer.
    A+
    0
    1. anton26 Messages postés 33 Statut Membre
       
      Oui je suis dans le même cas mais comment est ce que on fait pour copier un programme dans un objet créé depuis une boite a outils ?

      Merci
      0
    2. piopicolo Messages postés 1422 Statut Membre 200
       
      Tu fais apparaître l'objet userform et tu cliques droit sur l'objet en question : code.
      Le code vide apparaît et tu peux y coller n'importe quel programme.
      A+
      0