Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

portée variables dans Module de classe et Userform

6 réponses
Avatar
Emcy
bonjour,

J'ai un Userfrom dans lequel j'ai des Label.
J'ai créer un module de classe pour simplifier la gestion de l'evenement
Click de chaque Label

A l'initialisation de mon Userform, j'affecte mes Label dans la variable
ListLabel()
Dans Mon Userform j'ai déclaré deux variable UserCaption et UserLabel

ce que je voudrais c'est que lorsque je clic sur un de mes Label, j'affecte
dans UserCaption la valeur de caption du Label selectionné et dans UserLabel
l'objet Label (selectionné)

Comment faire (je veux que tout le code apparaisse soit dans le userform
soit dans le module de classe : non pas dans le module qui appele le
userform) ?

6 réponses

Avatar
anonymousA
Bonjour, meilleurs voeux

je ne suis pas sur de saisir exactement ta demande. Mais j'ai fait un
petit exemple suivant qui illustre que l'ensemble des codes sont
contenus à la fois dans le module du UF et dans celui du module de
classe, le seul code situé dans un autre module étant l'appel au UF.

Dans un module de classe nommé Cls1

Public WithEvents lbl As MSForms.Label

Private Sub lbl_Click()

usercaption = lbl.Caption
Set userlabel = lbl
MsgBox userabel.Caption & "/ " & userlabel.name

End Sub

Dans le module du UF

Dim arrlbl(1 To 2) As New Cls1
Public usercaption As String
Public userlabel As MSForms.Label

Private Sub UserForm_Initialize()

Set arrlbl(1).lbl = Me.Label1
Set arrlbl(2).lbl = Me.Label2

End Sub

Dans un module standard

userform1.show

Je ne sais pas si ca peut t'aider et si ca correspond exactement à ta
demande. Dans le cas contraire, renvoies une suite.

A+
Avatar
michdenis
Bonjour anonymousA,

MsgBox userabel.Caption & "/ " & userlabel.name
A ) Il y a une faute d'orthographe : c'est UserLabel.Caption

B ) Lbl dans ton module de classe représente déjà le Label qui vient
d'être cliqué. Pourquoi utilisé une seconde variable pour faire le
travail ?
Set userlabel = lbl

C ) Si tu utilises une variable déclarée dans un module de classe que ce
soit le module de classe que tu as ajouté ou celui du formulaire ou des
modules de feuille, cette variable est plutôt une "PROPRIÉTÉ" appartenant
au module de classe où elle a été créée et à ce titre pour pouvoir y faire
référence en dehors de son module, elle doit être précédée du nom de
l'objet de ladite "Classe d'objet" .

D ) L'exemple que tu as donné transgresse à plus d'un égard les notions
de base de la programmantion objet. Le fait que le msgbox affiche
l'information demandée ne rend pas cet exemple plus acceptable !

C'était seulement pour le smilllmaidcck !!!


Salutations!


"anonymousA" a écrit dans le message de news:
Bonjour, meilleurs voeux

je ne suis pas sur de saisir exactement ta demande. Mais j'ai fait un
petit exemple suivant qui illustre que l'ensemble des codes sont
contenus à la fois dans le module du UF et dans celui du module de
classe, le seul code situé dans un autre module étant l'appel au UF.

Dans un module de classe nommé Cls1

Public WithEvents lbl As MSForms.Label

Private Sub lbl_Click()

usercaption = lbl.Caption
Set userlabel = lbl
MsgBox userabel.Caption & "/ " & userlabel.name

End Sub

Dans le module du UF

Dim arrlbl(1 To 2) As New Cls1
Public usercaption As String
Public userlabel As MSForms.Label

Private Sub UserForm_Initialize()

Set arrlbl(1).lbl = Me.Label1
Set arrlbl(2).lbl = Me.Label2

End Sub

Dans un module standard

userform1.show

Je ne sais pas si ca peut t'aider et si ca correspond exactement à ta
demande. Dans le cas contraire, renvoies une suite.

A+
Avatar
Emcy
merci


"anonymousA" a écrit dans le message de news:

Bonjour, meilleurs voeux

je ne suis pas sur de saisir exactement ta demande. Mais j'ai fait un
petit exemple suivant qui illustre que l'ensemble des codes sont
contenus à la fois dans le module du UF et dans celui du module de
classe, le seul code situé dans un autre module étant l'appel au UF.

Dans un module de classe nommé Cls1

Public WithEvents lbl As MSForms.Label

Private Sub lbl_Click()

usercaption = lbl.Caption
Set userlabel = lbl
MsgBox userabel.Caption & "/ " & userlabel.name

End Sub

Dans le module du UF

Dim arrlbl(1 To 2) As New Cls1
Public usercaption As String
Public userlabel As MSForms.Label

Private Sub UserForm_Initialize()

Set arrlbl(1).lbl = Me.Label1
Set arrlbl(2).lbl = Me.Label2

End Sub

Dans un module standard

userform1.show

Je ne sais pas si ca peut t'aider et si ca correspond exactement à ta
demande. Dans le cas contraire, renvoies une suite.

A+
Avatar
anonymousA
Bonjour,

A-exact, il s'agit d'une erreur d'orthographe.

B et C-En effet, j'ai omis dans la rapidité de la réponse qu'il est
vrai qu'il est nécessaire de dénommer le module où se situe la
variable donc qu'il convient d'écrire Set UserForm1.userlabel = lbl
MsgBox UserForm1.userlabel.Caption & "/" & UserForm1.userlabel.Name
Ceci dit, le seul interet de ce Set est l'affectation à une variable
qu'en conséquence on peut réutiliser dans la suite pour une autre
procédure , que cette dernière, d'ailleurs, appartienne au module du
UF ou à un autre module. Le Msgbox , du coup , serait plus parlant si
p.e il existait un commandbutton et que le click sur celui-ci
déclencherait une proc contenant MsgBox UserForm1.userlabel.Caption &
"/" & UserForm1.userlabel.Name auquel cas il serait visible que ce qui
est contenu dans la variable userlabel est bien formellement identique
au dernier label cliqué.

D-Qu'à celà ne tienne. Sois donc remercié par avance de m'énumerer
les "plus d'un égard" . Je ne demande qu'à m'enrichir.

A+
Avatar
michdenis
Bonjour anonymousA,

| Sois donc remercié par avance de m'énumerer
| les "plus d'un égard" . Je ne demande qu'à m'enrichir.

Je croyais l'avoir fait dans le message précédent .... t'avoir mis au moins sur la piste !

Prenons ce bout de code de ton module de classe :
'--------------------------
Private Sub lbl_Click()

usercaption = lbl.Caption
Set userlabel = lbl
MsgBox userabel.Caption & "/ " & userlabel.name

End Sub
'--------------------------

A ) Lbl représente le label qui vient d'être cliqué
nul besoin d'utiliser une variable pour faire ce travail
Le msgbox devrait se lire pour être conséquent :
Msgbox Lbl.caption & "/ " & lbl.name

B ) Dans le module formulaire, tu fais la déclaration
de ces variables :
Public usercaption As String
Public userlabel As MSForms.Label
Le fait que tu utilises ces noms de variables dans ton module de
classe dans la procédure citée plus haut, laisse croire qu'il s'agit
effectivement des mêmes variables que tu renseignes dans ladite
procédure. En fait, il n'en n'est rien. La déclaration de tes 2
variables dans ton formulaire ne servent absolument. Pour les utiliser
adéquatement dans ton module de classe cls1, il aurait fallut les faire précéder
du Nom de l'objet "Userform1.usercaption" et "userform1.userlabel"
Et pour être plus pointilleux, il aurait fallut que tu utilises le terme "PROPRIÉTÉ"
pour désigner ces dernières plutôt que le terme variable.

En conséquence, les 2 variables utilisées dans ton module de classe sont des
variables :
1 - locales ... c'est à dire que l'étendue de leur action se limite
au niveau de cette procédure et on ne peut pas y faire référence
à l'extérieur de cette procédure. Pourtant, Lbl est déjà disponible
pour toutes les procédures de ton module de classe.
2 - des variables NON DÉCLARÉES au niveau d'une procédure
c'est pas top en programmation.

Conclusion : Pour demeurer poli, ton exemple fait preuve d'une grande confusion.
Ose prétendre le contraire si la chose t'amuse....mais faut pas compter sur moi
pour alimenter la suite de cet échange!!!


Salutations!







"anonymousA" a écrit dans le message de news:
Bonjour,

A-exact, il s'agit d'une erreur d'orthographe.

B et C-En effet, j'ai omis dans la rapidité de la réponse qu'il est
vrai qu'il est nécessaire de dénommer le module où se situe la
variable donc qu'il convient d'écrire Set UserForm1.userlabel = lbl
MsgBox UserForm1.userlabel.Caption & "/" & UserForm1.userlabel.Name
Ceci dit, le seul interet de ce Set est l'affectation à une variable
qu'en conséquence on peut réutiliser dans la suite pour une autre
procédure , que cette dernière, d'ailleurs, appartienne au module du
UF ou à un autre module. Le Msgbox , du coup , serait plus parlant si
p.e il existait un commandbutton et que le click sur celui-ci
déclencherait une proc contenant MsgBox UserForm1.userlabel.Caption &
"/" & UserForm1.userlabel.Name auquel cas il serait visible que ce qui
est contenu dans la variable userlabel est bien formellement identique
au dernier label cliqué.

D-Qu'à celà ne tienne. Sois donc remercié par avance de m'énumerer
les "plus d'un égard" . Je ne demande qu'à m'enrichir.

A+
Avatar
anonymousA
....mais faut pas compter sur moi pour alimenter la suite de cet échan ge!!!


Ben ca tombe bien, parce que si tu avais lu entre les lignes et pris la
peine de me lire attentivement , tu aurais compris que je ne te
demandais rien , étant entendu que j'avais déjà répondu dans mon
POST précédent à toutes tes remarques d'ordre informatique.

Ensuite, je n'ai rien à oser ou pas. Je suis libre d'écrire ce que je
veux et parfois de me tromper ou d'omettre , ce qui ne semble guère
être ton cas . De mon point de vue , pour clore ce débat et
commencer une excellente année 2006 , il m'apparait que ta suffisance
et ta condescendance sont , semble t-il, proportionnelles au nombre
de tes contributions.

End of the story.