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
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
- Messages
- 4'096
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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
- Messages
- 4'096
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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
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
- Messages
- 4'096
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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