Nom d un userform dans une variable
Bonjour,
J'ai dans 2 userform un multipage dont les textbox, lisbox, label,.... ont le même nom pour simplifier mon programme.
J'ai créé une sub qui permet de remplir ces éléments.
Cette sub a pour paramétres nom et prenom car il faut chercher la bonne ligne dans une feuille nommé "listagent"
Le dernier paramètre est le nom de la sub à modifier
ma sub à ce code :
Code:
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 48 49 50
| Sub cyclemodif(nom As String, pre As String, feuille As String)
Dim FEUIL As UserForm
Set FEUIL = feuille
For z = 5 To 102
If nom = Sheets("listagent").Range("b" & z).Value And pre = Sheets("listagent").Range("c" & z).Value Then
x = 5
For y = 1 To 4 'boucle pour passer les 4 semaines
v = 1
FEUIL.Controls("nomagsem" & y).Caption = nom & " " & pre 'remplir le nom des agents
For w = 1 To 7 'boucle pour passer tous les jours d'1 semaine
FEUIL.Controls("s" & y & "_j" & w & "_hdeb").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
v = v + 1
FEUIL.Controls("s" & y & "_j" & w & "_hfin").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
v = v + 1
FEUIL.Controls("s" & y & "_j" & w & "_pdeb").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
v = v + 1
FEUIL.Controls("s" & y & "_j" & w & "_pfin").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
v = v + 1
Next w
'remplir la page cycle
FEUIL.nomagsem5.Caption = nom & " " & pre
num = Sheets("listagent").Range("d" & z).Value
FEUIL.cyc_nbrcyc.Value = num
For w = 1 To 8 'masque les cellules semaine non utilisé
If FEUIL.cyc_nbrcyc.Value < w Then
FEUIL.Controls("cyc_s" & w).Visible = False
FEUIL.Controls("cyclab_s" & w).Visible = False
End If
Next w
For w = 1 To num
FEUIL.cyc_s1.Value = Sheets("listagent").Cells(z, w + 117).Value
Next w
x = x + 28 'saute d'1 semaine sur la feuille
Next y
Exit For
End If
Next z
End Sub |
J'ai essayé plusieurs solutions comme définir feuille en userform, ou objet, ou worksheet:
Code:
Sub cyclemodif(nom As String, pre As String, feuil As userform)
J'ai utilisé
Code:
VBA.UserForms.Add(sVariable).
sans succés.
J'ai des messages d'erreurs ou les cellules ne se remplissent pas !!!!!
Il me semble l'avoir déjà fait mais je ne retrouve rien dans mes projets précédents.
merci pour votre aide
pas compris et ne fonctionne pas
Bonsoir,
Désolé pour la réponse tardive mais je suis un peu pris ces derniers temps.
J'ai un soucis de compréhension sur ta proposition et en particulier sur Les 2 propositions me donnent un message d'erreur "type defini par l'utilisateur non defini"
Pour aider, la sub ci dessus est appelé par celle ci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| Private Sub Liste_Click()
Dim z As Integer
Dim y As Integer
Dim x As Integer
Dim w As Integer
Dim v As Integer
Dim nom As String
Dim nom1 As String
Dim pre As String
Dim lister As Object
'remplir le tableau des 4 semaines
Set lister = nvelleann.LISTE
nom = lister.ListItems(lister.SelectedItem.Index).Text
pre = lister.ListItems(lister.SelectedItem.Index).ListSubItems(1).Text
cyclemodif nom, pre,"nvelleann"
nvelleann.Show
End Sub |
Cette privatesub est appelé depuis un bouton de l'userform "nvelleann"
D'autres sub appelerons la sub cyclemodif pour remplir un autre userform
Le but de la sub cyclemodif est qu'un multipage contenant un nombre important de contrôles se retrouve dans plusieurs userform.
J'ai mis les mêmes noms de contrôles dans chacun des userform.
La sub cyclemodif doit me remplir les contrôles dans l'userform que je nomme en 3ième argument.
Par contre concernant ceci :
Citation:
Pour atteindre les controles de ta Userform, il faut effectivement utiliser controles (la collection des controles de ta Userform) mais pas comme tu le fais.
Regarde l'aide sous l'editeur de macro / sur ce forum. Tu vas trouver plein d'exemple !
J'utilise "controls" et non controles mais il me sert à mettre en forme le nom d'un contrôle à atteindre.
Certains contrôles ont le même nom avec 1 chiffre pour les différencier.
Pour les atteindre et les remplir j'utilise une boucle dans lequel je nomme le contrôles par controls "nom en lettre" & chiffre qui le différencie.
Je gagne ainsi des lignes de code et le programme fonctionne bien.
J'utilise souvent cet appelation et je n'ai pas eu de problèmes jusqu'à présent.
J'ai recherché sur ce forum "editeur de macro" sans vraiment trouver de réponses.
Peux tu être plus explicites ?
Peux tu me donner un lien d'un tuto ou d'une discussion ?
Merci pour ton aide
Solution trouvée mais est ce bien ?
bonjour,
Bon après un peu de recherche sur tes infos et un peu de réflexion, je suis arrivé à cette solution qui fonctionne :
Pour modif cycle :
Code:
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 48 49 50 51 52 53
| Sub cyclemodif(nom As String, pre As String, feuille As UserForm)
'Dim UF_Feuille As myUserForm
'Set UF_Feuille = New myUserForm
Dim feuil As UserForm
Set feuil = feuille
For z = 5 To 102
If nom = Sheets("listagent").Range("b" & z).Value And pre = Sheets("listagent").Range("c" & z).Value Then
x = 5
For y = 1 To 4 'boucle pour passer les 4 semaines
v = 1
feuil.Controls("nomagsem" & y).Caption = nom & " " & pre 'remplir le nom des agents
For w = 1 To 7 'boucle pour passer tous les jours d'1 semaine
feuil.Controls("s" & y & "_j" & w & "_hdeb").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
v = v + 1
feuil.Controls("s" & y & "_j" & w & "_hfin").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
v = v + 1
feuil.Controls("s" & y & "_j" & w & "_pdeb").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
v = v + 1
feuil.Controls("s" & y & "_j" & w & "_pfin").Value = Format(Sheets("listagent").Cells(z, x + v).Value, "hh:mm")
v = v + 1
Next w
'remplir la page cycle
feuil.nomagsem5.Caption = nom & " " & pre
num = Sheets("listagent").Range("d" & z).Value
feuil.cyc_nbrcyc.Value = num
For w = 1 To 8 'masque les cellules semaine non utilisé
If feuil.cyc_nbrcyc.Value < w Then
feuil.Controls("cyc_s" & w).Visible = False
feuil.Controls("cyclab_s" & w).Visible = False
End If
Next w
For w = 1 To num
feuil.cyc_s1.Value = Sheets("listagent").Cells(z, w + 117).Value
Next w
x = x + 28 'saute d'1 semaine sur la feuille
Next y
Exit For
End If
Next z
End Sub |
et pour l'appel de cette sub :
Code:
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
| Private Sub Liste_Click()
Dim z As Integer
Dim y As Integer
Dim x As Integer
Dim w As Integer
Dim v As Integer
Dim nom As String
Dim nom1 As String
Dim pre As String
Dim lister As Object
'remplir le tableau des 4 semaines
Set lister = nvelleann.LISTE
nom = lister.ListItems(lister.SelectedItem.Index).Text
pre = lister.ListItems(lister.SelectedItem.Index).ListSubItems(1).Text
cyclemodif nom, pre, nvelleann
End Sub |
Encore merci pour ton aide.
Je reviendrai voir si tu as apportés une réponse.
a bientôt