savoir quel control est selectionné dans un Uesr

ericTA

XLDnaute Occasionnel
Bonjour à tous,
petite question pour simplifier du code, je m'explique.
Dans un USER j'ai 42 Labels qui correspondent à des produits, quand on clic sur un label je lance une macro avec le nom du label. Sauf que j'ai 42 Sub LabelN, il y a t il un moyen de savoir si un label à était sélectionné, pour n'avoir qu'une macro ?
Je ne sais pas si j'ai était suffisamment clair.
Merci d'avance
Eric
 

Dranreb

XLDnaute Barbatruc
Bonsoir
Il est aussi possible de déclarer une variable WithEvents Lab As MSForms.Label
Malheureusement il n'existe pas d'évènement UserForm détectant un changement de focus. Alors il faut faire une boucle dans l'UserForm_Activate qui vérifie en permanence si le contrôle actif est toujours le même que précédemment.
 

ericTA

XLDnaute Occasionnel
Merci pour les réponses avec un peu de recherche j'ai trouvé il faut :
déclarer un Module de classe ici CL_Label avec :

Public WithEvents GroupeLabel As MSForms.Label

Private Sub GroupeLabel_Click()

Call MyForm.LabelClick(Mid(GroupeLabel.Name, 6))) ' retour le numéro du Lael
' Le nom de la macro "LabelClick" dans le Userform MyForm avec comme paramètre le numéro du label
End Sub

' **************************************************************************
Dans mon Userform "MyForme" :

Dim CtrLabel(1 To 20) As Cl_Label ' il y a 20 labels

Sub LabelClick(NumLabel)
MsgBox "tu as cliqué sur le label : " & NumLabel 'Macro à utiliser comme on veut
End Sub

Private Sub UserForm_Initialize()

Dim i as integer
For i = 1 To 20 'il y a 20 labels
Set CtrLabel(i) = New Cl_Label
Set CtrLabel(i).GroupeLabel = Controls("label" & i)
Next i
End Sub

Maintenant a chaque fois que je clic sur un label la macro LablelClick s'exécute.

Mais j'aimerai aller plus loin et je n'y arrive pas.
Dans mon module de classe je lance la macro qui est dans MyForm :
Call MyForm.LabelClick(GroupeLabel.Name))
Comment faire pour que ce soit l'user actif ?
C'est à dire que je puisse utiliser ce module de classe pour plusieurs user
MyForm = l'user actif


l'idée est peut être de passer par une variable public de type Userform mais je ne trouve pas
Help
Merci d'avance
Eric
 

Dranreb

XLDnaute Barbatruc
Si vous voulez accéder depuis ailleurs à quelque chose qui est défini dans votre UserForm il faut que ce soit une propriété ou une méthode. C'est à dire que, par définition même de ces deux termes, il faut que ça y soit Public. Parce qu'un UserForm est un objet. Ça ne suit donc pas la même règle qu'une variable Public dans un module standard.
Remarque: les contrôles sont Public, et ce sont donc des propriétés. Mais vous pouvez très bien ajouter d'autres choses également Public. Par défaut dans un UserForm une procédure ou une variable globale déclarée avec Dim est Private.
 
Dernière édition:

ericTA

XLDnaute Occasionnel
Je viens de trouver, voici le résultat (plus propre)

je défini un variable dans un module
Public MyForm As Object


puis je déclarer un Module de classe ici CL_Label avec :

' ****************************** Module de classe ********************************************
Public WithEvents GroupeLabel As MSForms.Label

Private Sub GroupeLabel_Click()

Call MyForm.LabelClick(Mid(GroupeLabel.Name, 6))) ' retour le numéro du Lael
' Le nom de la macro "LabelClick"
End Sub


' ******************************** Userform ******************************************
Dans mon Userform "MonUSER" :

Const NombreDeLabel As Integer = 20 ' il y a 20 labels
Dim CtrLabel(1 To NombreDeLabel) As Cl_Label


Sub LabelClick(NumLabel) ' Macro qui s'exécute quand on clic sur un Label de l'userform
MsgBox "tu as cliqué sur le label : " & NumLabel 'Macro à utiliser comme on veut
End Sub

Private Sub UserForm_Initialize()

Dim i as integer
Set MyForm = MonUSER ' je passe l'userform en variable

For i = 1 To NombreDeLabel
Set CtrLabel(i) = New Cl_Label
Set CtrLabel(i).GroupeLabel = Controls("label" & i)
Next i
End Sub


Maintenant je peux utiliser cette méthode pour tt les USER en changeant simplement le nombre de Label et le le nom du USER par le nom du User actif ici :

Set MyForm = MonUSER

Cette méthode peut s'appliquer à tt les controls 'Button", "Picture"...

j'espère que cette astuce pourra vous servir, elle réduit considérablement le code
A+
Eric
 

Dranreb

XLDnaute Barbatruc
Comme dit précédemment, oui, à condition de mettre Public Sub LabelClick(NumLabel)

Remarque: Public MyForm As Object pourrait être déclaré dans le module de classe.
Mais j'appelle en général Parent cette propriété, alors.
Set CtrLabel(i).Parent = Me

Ce serait d'un usage plus général en transmettant plutôt le Label lui même:
Public Sub LabelClick(ByVal Lab As MSForms.Label)
 
Dernière édition:

ericTA

XLDnaute Occasionnel
Non pas besoin, c'est pas une macro générale mais une macro liée à l'UserForm, ça marche très bien.
La macro LabelClick(NumLabel) est dans mon Userform, donc pas besoin.
est dans le module de classe je pointe bien sur la macro qui est dans mon Userform. "MonUSER"
Call MyForm.LabelClick(Mid(GroupeLabel.Name, 6))) ' il y a Set MyForm = MonUSER dans mon Userform
j'ai une macro LabelClick(NumLabel) dans chaque Userform qui utilise cette fonction, qui peut faire un traitement différent dans chaque USERFORM (heureusement)
Il y a peut être plus simple ...
Cordialement
Eric
 

Dranreb

XLDnaute Barbatruc
J'entends "j'ai une macro Public Sub LabelClick(ByVal NumLabel As Long) dans chaque Userform qui utilise ça".
C'est quoi votre question ?

Par quoi diffèrent-ils vos différents UserForm ?
S'ils se ressemblent beaucoup vous pourriez n'en définir qu'un …même s'il fallait pouvoir en afficher plusieurs exemplaires en même temps.

Mettez plutôt Set MyForm = Me
Mais Public Parent As Object dans le module de classe serait plus souple.
Surtout si plusieurs UserForm qui l'utilisent sont chargés en même temps.
 
Dernière édition:

ericTA

XLDnaute Occasionnel
Effectivement, j'ai changé mon code, c'est beaucoup mieux est plus universelle.
GRAND MERCI :)

Eric
Idéalement serait d'avoir le nombre de label dans l'Userform


le résultat :
je défini une variable dans un module (j'ai un module avec toutes les déclarations plublic)
Public MyForm As Object


puis je déclarer un Module de classe ici CL_Label avec :

' ****************************** Module de classe ********************************************
Public WithEvents GroupeLabel As MSForms.Label

Private Sub GroupeLabel_Click()

Call MyForm.LabelClick(GroupeLabel)
' je retourne le label

End Sub


' ******************************** Userform ******************************************
Dans mon Userform "MonUSER" :

Const NombreDeLabel As Integer = 20 ' il y a 20 labels
Dim CtrLabel(1 To NombreDeLabel) As Cl_Label


Sub LabelClick(ByVal Lab As MSForms.Label)
MsgBox "tu as cliqué sur un le label : " & Lab.Name & " " & Lab.Caption
End Sub

Private Sub UserForm_Initialize()

Dim i as integer
Set MyForm = Me ' je passe l'userform en variable

For i = 1 To NombreDeLabel
Set CtrLabel(i) = New Cl_Label
Set CtrLabel(i).GroupeLabel = Controls("label" & i)
Next i
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 330
Messages
2 087 342
Membres
103 524
dernier inscrit
Smile1813