Contrôles dynamiques et modules de classe

bonjour

pour des besoins de gestion de stock , j'ai crée un userform dynamique (création de frame en fonction du nombre de ligne du fichier ( nomenclature de projet))

chaque frame correspond a un ligne du fichier.

je voudrais utiliser le module de classe pour gérer le command button le checkbox , le textbox et les deux option box mais après avoir parcouru les forums et visualiser des tuto , j'avoue que je suis perdu

ci dessous le code de mon userform

Private Sub UserForm_INITIALIZE()

Dim fr As Control
Dim cb As Control
Dim lb As Control
Dim CHB As Control
Dim txb As Control
Dim ob As Control
Dim ob1 As Control

derniere_ligne = Sheets(1).Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row

For I = 2 To derniere_ligne

'----- Initialise l'userform ---------------
Me.BackColor = &H800000
Me.Height = 700
Me.Width = 500
Me.Caption = " gestion des transfert de stock "

'------ Créer le Frame1 ---------------------
Set fr = Me.Controls.Add("Forms.frame.1", "Frame" & I, True)

With fr
.Left = 6
.Top = 41
.Width = 400
.Height = 35

'Fr.BackColor = &HFFC0FF
.BorderStyle = fmBorderStyleSingle
.BorderColor = &HFFFFFF
End With

If I > 2 Then fr.Top = (6 * I) + (35 * (I - 1))

''------ Créer le commandbutton ------------------
'
Set cb = fr.Controls.Add("Forms.commandbutton.1", "commandbutton" & I, True)

With cb
.Left = 3
.Top = 8
.Width = 18
.Height = 18
End With
'


'''------ Créer le Label ---------------------
'
Set lb = fr.Controls.Add("Forms.Label.1", "Label" & I, True)
With lb

.Left = 30
.Top = 8
.Width = 192
.Height = 18
.AutoSize = False
.BackStyle = 1
.BorderColor = &H80000006
.BackColor = &HFFFFFF
.BorderStyle = fmBorderStyleSingle
.FontSize = 10
.FontBold = True
.TextAlign = fmTextAlignCenter
.Caption = Range("A" & I).Value

End With

' '------ Créer le checkbox ---------------------
Set CHB = fr.Controls.Add("Forms.checkbox.1", "checkbox" & I, True)

With CHB
.Left = 250
.Top = 8
.Value = True
End With


'------ Créer le textbox ---------------------


Set txb = fr.Controls.Add("Forms.textbox.1", "textbox" & I, True)

With txb
.Left = 270
.Top = 8
.Width = 50
.Height = 18
'.Visible = False

End With

'------ Créer le optionbutton ---------------------
'If Range("D" & I + 1).Value <> "" Then


Set ob = fr.Controls.Add("Forms.OptionButton.1", "OptionButton_neuf" & I, True)

With ob
.Left = 330
.Top = 2
.Width = 80
.Height = 15
.Caption = "NEUF"
.ForeColor = &HFFFFFF
'.Visible = False
End With

Set ob1 = fr.Controls.Add("Forms.OptionButton.1", "OptionButton_refurb" & I, True)

With ob1
.Left = 330
.Top = 18
.Width = 80
.Height = 15
.Caption = "REFURB"
.ForeColor = &HFFFFFF
'.Visible = False
End With
'End If
Next I
With Me
.ScrollHeight = 42 * derniere_ligne

.ScrollBars = fmScrollBarsVertical
End With

end sub

chaque frame correspond a un ligne du fichier

je voudrais utiliser le module de classe pour gérer le command button , le checkbox ,le textbox et les deux option box mais après avoir parcouru les forums et visualiser des tuto , j'avoue que je suis perdu

stock

quand je clique sur le checkbox d'une des frames ,

qd la croix est coche , le textbox et les deux option box de la frame doivent être visible

qd la croix est n 'est pas coché , le textbox et les deux option box de la frame ne doivent être visible

Ci joint le fichier excel en pièce jointe

merci d'avance pour votre aide

Bonsoir,

ci-jointe une proposition :

merci pour ton aide

je regarde la propo que tu as faire

...

bonjour

grace a thev , j'ai pu avancer sur mon projet .j'ai donc crée un deuxième userform ( userform gestion produit )qui liste les produits ayant une nomenclature

qd je clic sur un des optionbutton , le fond du label correspondant doit passer au vert

et cela va ouvrir un text box demandant

si on veut ouvrir la gestion nomenclature correspondant ( ouverture de usf 2)

ou modifier son choix ( retour sur usf fond du label sélectionne revient en blanc , option button selectionne auparavent n'est plus selectionné .

SI le choix est confirmé ,on ouvre le deuxieme userform qui liste la nomenclature du produit ( les dix premier caractere du contenu label est le nom de l'onglet contenant la nomenclature a ouvrir a ce deuxieme usf que la personne doit remplir )

les command button de ce deuxieme usf , ils servent a ouvrir une photo dont le nom est ds la colonne 5 ( de l'article )dans le userform photo

dans le premier userform c’était facile car je mettais en fond vert le label qui était dans la même frame que le checkbox sélectionné

mais pour ce nouveau usf , tous les label et optionbutton dans l'usf

donc si optiobutton1 est sélectionné , c'est label1qui passe en vert

tous mes essais ne fonctionnent pas , j'ai du mal avec la logique des module de classe

pourriez vous m'aider svp

et si quelqu'un a un lien pour un tuto simple afin d'expliquer la logique module de classe ( du style module de classe pour grand debutant lol) , je suis preneur ....merci d'avance

ci joint mon fichier

et merci a tous

Bonjour,

ci-joint votre fichier corrigé pour les 2 nouveaux modules de classe :

Il manquait dans ces 2 modules la procédure relative à l'événement clic. Par ailleurs, pour affecter l'instance de la classe appelée par l'événement Clic de votre formulaire, il faut utiliser les variables qui y sont définies : frame_box et lbl_texte. Donc dans les modules de classe :

Set formulaire.frame_box = instance
Set formulaire.lbl_texte = instance

Pour info :

Une classe par définition regroupe des objets ayant les mêmes propriétés, les mêmes événements et les mêmes procédures (actions).
Il existe une kyrielle de classes prédéfinies: Workbook, WorkSheet, Range, UserForm …..

Un module de classe permet de définir des propriétés, événements ou procédures personnalisés pour un objet. Dans le cas qui nous occupe, cet objet est un contrôle de formulaire : CommandButton, OptionButton, ...
Après il faut associer à chaque contrôle de formulaire un élément de cette classe, cet élément étant appelé dans le jargon VBA, une instance. Chaque instance doit être stockée au niveau du code pour que ce dernier puisse y faire appel.
Le lien permettant d'accéder à une instance, est stocké en général dans une classe VBA de type collection : Collection , Dictionary ou dans l'instance elle-même (option que j'ai choisie).

Un tuto:

https://fauconnier.developpez.com/articles/vba/general/classes/

un grand merci

en parallèle j'ai travaille sur la récupération des données remplies dans l usf ci dessous ( usf gestion)

j'ai ajouter un command button qui sera activé quand les différentes frames seront remplies

je check le contenu de l'usf et si c est une frame , je check le contenu de la frame pour récupérer les infos ci dessous (afin de les mettre dans une feuille excel )

si la chexbox est cochée je récupere les infos

labelbox :article

texbox : quantité

option box : article neuf ou rénové

j'aurais alors une feuille excel avec les info article qui sont cochés

mais je rencontre un pb sur la ligne pour checker le contenu de la frame

For Each ctrl_1 In Me.Controls(ctrl.Name).Controls
132893 6621319a42ab3079065407
Private Sub CommandButton1_Click()
 Dim valeur_chekbox As String
 Dim quantité As String
 Dim article_neuf As String
  Dim article_refurb As String
 Dim I As Integer

Dim ctrl As Control
Dim ctrl_1 As Controls

 For Each ctrl In Me.Controls
    If TypeOf ctrl Is msforms.frame Then
    MsgBox ctrl.Name

        'For Each ctrl_1 In Me.Controls(ctrl.Name).Controls
        For Each ctrl_1 In me.(ctrl.Name).Controls

            If TypeOf ctrl_1 Is msforms.CheckBox Then valeur_chekbox = ctrl_1.Value
            If TypeOf ctrl_1 Is msforms.TextBox Then quantité = ctrl_1.Value
            If TypeOf ctrl_1 Is msforms.OptionButton Then
                If ctrl_1.Caption = "NEUF" Then article_neuf = ctrl_1.Value
                If ctrl_1.Caption = "REFURB" Then article_refurb = ctrl_1.Value
            End If
        Next
    End If
Next

End Sub

Bonsoir,

déjà

Dim ctrl_1 As Control

et non

Dim ctrl_1 As Controls

ci-dessous votre code modifié :

Private Sub CommandButton1_Click()
    Dim valeur_chekbox As String
    Dim quantité As String
    Dim article_neuf As String
    Dim article_refurb As String
    Dim I As Integer

    Dim ctrl As Control
    Dim frame_i As Control
    Dim ctrl_1 As Control

    For Each ctrl In Me.Controls

        If TypeOf ctrl Is msforms.frame Then
            MsgBox ctrl.Name
            Set frame_i = ctrl
            For Each ctrl_1 In frame_i.Controls
                If TypeOf ctrl_1 Is msforms.CheckBox Then valeur_chekbox = ctrl_1.Value
                If TypeOf ctrl_1 Is msforms.TextBox Then quantité = ctrl_1.Value
                If TypeOf ctrl_1 Is msforms.OptionButton Then
                    If ctrl_1.Caption = "NEUF" Then article_neuf = ctrl_1.Value
                    If ctrl_1.Caption = "REFURB" Then article_refurb = ctrl_1.Value
                End If
            Next ctrl_1
        End If

    Next ctrl

End Sub

merci pour ton aide

je peux clore le sujet

Rechercher des sujets similaires à "controles dynamiques modules classe"