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

Résolu/Fermé
anton26 Messages postés 31 Date d'inscription samedi 22 décembre 2012 Statut Membre Dernière intervention 25 janvier 2016 - 23 déc. 2012 à 12:38
piopicolo Messages postés 1395 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 31 juillet 2023 - 27 déc. 2012 à 09:18
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

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
anton26 Messages postés 31 Date d'inscription samedi 22 décembre 2012 Statut Membre Dernière intervention 25 janvier 2016
24 déc. 2012 à 16:02
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
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
anton26 Messages postés 31 Date d'inscription samedi 22 décembre 2012 Statut Membre Dernière intervention 25 janvier 2016
25 déc. 2012 à 20:39
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
piopicolo Messages postés 1395 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 31 juillet 2023 193
24 déc. 2012 à 10:37
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
anton26 Messages postés 31 Date d'inscription samedi 22 décembre 2012 Statut Membre Dernière intervention 25 janvier 2016
24 déc. 2012 à 12:01
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
piopicolo Messages postés 1395 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 31 juillet 2023 193
27 déc. 2012 à 09:18
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