Je vais tenter de faire court et suffisament clair :
- J'ai X Userforms comportant plusieurs ComboBox.
- Sur chaque Userform, j'ai un Label nommé "LabelAlerte"
- J'ai créée le module de classe suivant pour modifier le backcolor de ces combos en fonction de leur contenu :
Code:
Public WithEvents MonCombo As MSForms.ComboBox
Private Sub MonCombo_Change()
If MonCombo = "" Then
MonCombo.BackColor = &HFF&
Else
MonCombo.BackColor = &H80000005
End If
End Sub
Ma question : Je voudrais que mon module de classe fasse également apparaître ou disparaître le LabelAlerte situé sur le même Userform que le Combobox qui vient d'être modifié. J'ai essayé de rajouter :
Code:
Me.LabelAlerte.Visible = False
mais apparement la valeur de "Me" n'est pas utilisable dans le module de classe.
J'ai eu des réponses efficaces qui pourront, je l'espère 'aiguiller,
car le "Me" effectivement ne risque pas de fonctionner!
Il faut impérativement nommer l'USF.
Amicalement.
Yann
RECTIFICATIF:
Je n'avais pas lu ton second message!
Bien joué! Et Merci d'avoir partager.
Je viens encore d'apprendre quelque chose. D'où le bien fondé de ma signature...
Ah non c'était pas pour partager ! C'était juste pour que je puisse le retrouver d'ici une semaine quand j'aurai déjà oublié ! .
Je plaisante bien sûr.
Merci pour ton lien, ça pourrait m'être utile un de ces 4. Par contre je ne pense pas que ça soit utilisable dans le cadre des modules de classe puisque ce ne sont pas des procédures que l'on peut lancer avec des arguments. Donc aucun intérêt à transmettre le nom du Userform via une variable.
Par contre, il ya quelques autres cas où ton post risque de me rendre service.
Concernant la solution que j'ai trouvé, j'étais vraiment étonné qu'on puisse "remonter" dans la hiérarchie en utilisant le .Parent.
Concernant ta signature et même si je suis encore en "déficit" sur le plan question/réponse sur XLD, je suis on ne peut plus d'accord avec toi.
Avec quelque chose comme ceci (pour le module de classe)
Code:
Public WithEvents MonCombo As MSForms.ComboBox
Private Sub MonCombo_Change()
Dim oParent As Object
Set oParent = GetParent()
If MonCombo = "" Then
MonCombo.BackColor = &HFF&
Else
MonCombo.BackColor = &H80000005
End If
oParent.LabelAlerte.Visible = MonCombo.BackColor = &HFF&
End Sub
Private Function GetParent() As UserForm
Dim obj As Object
Set obj = Me.MonCombo
Do
Set obj = obj.Parent
DoEvents
Loop While Not TypeName(obj) Like "UserForm*"
Fin:
Set GetParent = obj
End Function
Dans une application solide, il faudrait faire créer une propriété Parent à initialiser au moment de l'initialisation de l'objet.
Entièrement d'accord avec toi pour le cas présenté.
C'était juste pour avoir un module de classe plus générique, et qui fonctionnera sur les combobox quelque soit leur parent.
Bonsoir Pierrot , et à ceux qui passeront par ici,
Je reconnais là la simplicité et l'efficacité de tes interventions.
Le constructeur de l'appli connaît forcément le nombre de paliers à remonter!
(Ce qui est à fortiori le cas de notre ami)
D'avoir les ComboBoxes dans des Frames ou non suivant ses différents USF,
ne serait que provoquer une complication inutile!... Je ne pense pas qu'il l'ait fait.
(Sinon il lui sera facile d'adapter ces derniers)
".Parent.Parent." est désormais bien ancré dans mes archives!
Merci à toi, ainsi que GeoTrouvePas saura certainement te le dire de même.
Entièrement d'accord avec toi pour le cas présenté.
C'était juste pour avoir un module de classe plus générique, et qui fonctionnera sur les combobox quelque soit leur parent.
ce n'était qu'une petite reflexion vite fait au passage... ne voulant rien enlever à ta solution, qui du reste est nettement plus pro... j'en profite d'ailleurs pour te remercier de nous faire partager tes talents.... bonne soirée
Je suis persuadé d'avoir essayé le double .Parent mais peut être pas de cette façon.
Malgré l'agréable simplicité de ton code, c'est celui d'Hasco que je vais utiliser car je ne suis pas sûr que la "profondeur" sera toujours la même dans les prochains userform.
En tout cas un grand merci à vous 3 et bon week end !
J'ai un plantage dans la fonction GetParent.
Elle déconne sur la ligne "Set obj = obj.Parent". Après avoir analysé un peu, on dirait que, lorsqu'on est remonté jusqu'au userform, la condition qui permet de sortir de la boucle Do ne fonctionne pas.
Si tu utilise TypeName(obj) il faut que ce que tu met entre parenthèse le nom de ton userForm.
Vba est différent de VB.
Au moment de l'exécution un nouvel objet est créé de Type "NomDuUserForm" dans la collection UserForms Si ton UserForm s'appelle "MonUserForm" alors.
Code:
Loop While Not TypeName(obj) = "MonUserForm"
Tu peux l' écrire également comme ceci:
Code:
Loop While Not TypeOf obj Is MonUserForm ' sans guillemet car MonUserForm est un type d'objet
C'est pourquoi je te disais qu'une application solide prévoirait une propriété Parent ou plutot ParentTypeName que tu pourrais initialisé au début et testé ensuite dans la boucle
Merci pour cette réponse Hasco, j'avais peur que mon message continuer de couler au fond du forum. Etant donné que je dois présenté ça demain, j'aurai été bien embêté.
L'embêtant c'est que j'ai essayé de passer par un module de classe pour justement ne pas avoir à tenir compte du Userform en cours d'utilisation.
Etant donné que j'ai envie de faire une application solide, je ne suis pas contre la création d'une propriété Parent mais malheureusement, ne ne connais absolument pas le principe. Vu que je suis pressé par le temps, je m'y pencherai plus tard.
J'ai une petite trentaine de userform dans mon application (dont les noms ne sont pas indicés), crois tu que ça soit viable si je fais quelques chose de ce genre :
Code:
Private Function GetParent() As UserForm
Dim Obj As Object
Set Obj = Me.MonCombo
While Obj.Name <> "UserformVoiture" or Obj.Name <> "UserformBureau" or Obj.Name <> "UserformMachine"........................
Set Obj = Obj.Parent
DoEvents
Wend
Set GetParent = Obj
End Function
C'est vraiment pas très joli mais ça me permettrait de pouvoir présenter mon application demain dans de bonnes conditions. Je prendrais le temps de faire un code plus propre pour la première mise à jour.
Edit : Une solution un peu plus "propre" mais pas encore parfaite serait de dire :
Tant que Obj.name n'appartient pas à la liste "UserformVoiture, UserformBureau, UserformMachine..."