Un petit tour sur les modules de classe

GeoTrouvePas

XLDnaute Impliqué
Bonjour tout le monde,

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.

Auriez vous une idée ?

Je vous remercie par avance
 
Dernière édition:

GeoTrouvePas

XLDnaute Impliqué
Re : Un petit tour sur les modules de classe

Ne vous embêtez pas, je viens de trouver la solution ! Mais je la garde pour moi ! :p:p:p

Non plus sérieusement, on peut retrouver la valeur de "Me" en utilisant MonCombo.Parent.

Il suffisait dont de faire :

Code:
MonCombo.Parent.LabelAlerte.Visible = False
 

YANN-56

XLDnaute Barbatruc
Re : Un petit tour sur les modules de classe

Bonjour GeoTrouvePas, et à ceux qui passeront par ici,

Regarde sur ce fil relatif à la mise en variable du nom de l'USF:

https://www.excel-downloads.com/threads/with-userform1-le-1-en-variable.155491/

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... :)
 
Dernière édition:

GeoTrouvePas

XLDnaute Impliqué
Re : Un petit tour sur les modules de classe

Merci d'avoir partager.

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é ! :p:p:p.

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.

Bonne journée
 

GeoTrouvePas

XLDnaute Impliqué
Re : Un petit tour sur les modules de classe

Petit problème :

Si le contrôle est placé dans un Frame, .Parent renvoi le Frame et non pas le Userform..........

J'ai voulu essayé de cumuler les .Parent jusqu'à pouvoir vérifier que VBCmp.Type = 3 mais ça ne fonctionne pas.

Auriez vous une idée ?
 

YANN-56

XLDnaute Barbatruc
Re : Un petit tour sur les modules de classe

Re GeoTrouvePas,

Je suis persuadé que la méthode proposée par Pierrot sur le fil
que j'ai cité ci-dessus est applicable. "With... Le Truc"

Je vais tenter le coup de mon coté car ce cas m'intéresse.

Cela va me demander un peu de temps car je suis sur un autre chantier,
et qu'il me sera nécessaire de construire tout une structure.

Je ne perds pas le "Fil" :)

Mais peut-être une bonne âme te donnera solution avant.

Amicalement.

Yann
 
G

Guest

Guest
Re : Un petit tour sur les modules de classe

Bonjour tous,

Si le contrôle est placé dans un Frame, .Parent renvoi le Frame et non pas le Userform..........

Arf, je l'attendais celle-ci:)

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.

A+
 
G

Guest

Guest
Re : Un petit tour sur les modules de classe

Re,

Hello Pierrot:)

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.

A+++
 

YANN-56

XLDnaute Barbatruc
Re : Un petit tour sur les modules de classe

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.

Yann
 

Pierrot93

XLDnaute Barbatruc
Re : Un petit tour sur les modules de classe

Re,
Bonsoir Hasco:), Yann:)


Re,

Hello Pierrot:)

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.

A+++

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

@+
 

GeoTrouvePas

XLDnaute Impliqué
Re : Un petit tour sur les modules de classe

Bien vu Hasco et Pierrot !

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 !
 

GeoTrouvePas

XLDnaute Impliqué
Re : Un petit tour sur les modules de classe

Problème !!!!

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.

J'ai essayé de le remplacer par :

Code:
Loop While Not TypeName(obj) Like "UserForm"
ou
Code:
Loop While Not TypeName(obj) = "Userform"

mais pas mieux.

J'ai même tenté :

Code:
Loop While Not obj.type = 3

mais dans ce cas là, ça plante pour les frames.

Auriez vous une idée ?
 
Dernière édition:
G

Guest

Guest
Re : Un petit tour sur les modules de classe

Bonjour GeoTrouvePas,

Arf...Je l'attendais celle-ci:)

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


A+
 
Dernière modification par un modérateur:

GeoTrouvePas

XLDnaute Impliqué
Re : Un petit tour sur les modules de classe

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..."
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 379
Messages
2 087 764
Membres
103 661
dernier inscrit
fcleves