Assigner même procédure à tous les contrôles d'un Userform

Bonjour le forum,

Je crée actuellement un formulaire sur un Userform qui comporte différents contrôles dans une Frame (TextBox et Combobox principalement)

Je souhaiterais récupérer le nom du contrôle à chaque fois que je clic sur l'un d'entre-eux.

Je voudrais donc utiliser un événement unique du genre :

Sub Ctrl_enter()

Textbox1.value = Ctrl.name

End Sub

J'ai cru comprendre qu'il fallait utiliser un module de classe pour assigner une même procédure à plusieurs contrôles mais je ne sais pas du tout comment m'y prendre.

On m'avait déjà proposé ce code (uniquement pour des CommandButton) mais je n'arrive pas à l'adapter à tous les contrôles quel que soit leur type :

Code à mettre dans le module de l'UserForm :

Dim Tbl() As New Classe1

Private Su UserForm_Initialize()

    Dim Ctrl As Control
    Dim I As Integer

    For Each Ctrl In Me.Controls

        If TypeName(Ctrl) = "CommandButton" Then

            I = I + 1: ReDim Preserve Tbl(1 To I)
            Set Tbl(I).GroupeBtn = Ctrl
            Set Tbl(I).Txt = TextBox1 'de façon à respecter l'encapsulage

       End If

    Next Ctrl

End Sub

Code à mettre dans le module de classe nommé "Classe1" (nom donné par défaut à l'ajout dans le projet) :

Public WithEvents GroupeBtn As MSForms.CommandButton
Public Txt As MSForms.TextBox

Private Sub Groupebtn_Click()

    Txt.Text = GroupeBtn.Caption

End Sub

J'avoue de rien comprendre aux modules de classe et je ne sais pas du tout comment assigner une même procédure à plusieurs contrôles différents.

Merci de votre aide !

Bonjour Audrey, bonjour le forum,

Je souhaiterais récupérer le nom du contrôle à chaque fois que je clic sur l'un d'entre-eux.

Tu vas en faire quoi ensuite de ce nom ? Car je ne vois pas à quoi cela pourrait servir...

Bonjour,

je sais pas trop non plus à quoi çà sert mais tu peux sans aucun doute mettre tes lignes dans le Private Sub UserForm_initialize()

Private Sub UserForm_initialize()
ComboBox1.Value = ComboBox1.Name
TextBox1.Value = TextBox1.Name
TextBox2.Value = TextBox2.Name
End Sub
4test.xlsm (18.70 Ko)

La manoeuvre n'est pas très conventionnelle je pense.

A côté de chacun de ces contrôles se trouve un label avec son titre :

Label Société pour TextBoxSociete

Label Nom pour TextBoxNom

Label Localité pour ComboboxLocalité

etc.

Je voudrais "allumer" le label du contrôle sélectionné --> changer la couleur du label dès que son contrôle est actif pour que l'utilisateur voit où il se situe dans le formulaire.

Mon idée était donc de :

1. Récupérer le nom du contrôle sélectionné dans une textbox cachée (avec le fameux module de classe)

2. A chaque changement de cette Textbox cachée :

Sub Textbox1_change()
If Textbox.value = "TextBoxSociete" Then
 LabelSociete.backcolor = rouge
Else 
LabelSociete.backcolor = blanc
End if

If Textbox.value = "ComboBoxLocalite" Then
 LabelLocalite.backcolor = rouge
Else 
LabelLocalite.backcolor = blanc
End if

'etc pour chaque label

End Sub

Je sais que je dois probablement me compliquer la vie mais je ne sais pas comment modifier la couleur de ces label en fonction du contrôle sélectionné...

Si vous avez une meilleure idée je suis preneuse ! Je dois absolument avancer sur ce formulaire mais le codage n'est pas mon fort

Bonjour la galère ! çà va le faire pour un Label mais quand vous allez faire un Textbox2 change alors vous allez devoir par défaut remettre tous les autres label

dans la couleur d'origine car Excel ne sait pas quel Label a changé avant celui en cours..... çà s'appel "une usine à gaz" juste de quoi ralentir votre excel.

Pour la gestion des couleurs si vous souhaitez persévérer :

https://www.excel-pratique.com/fr/vba/couleurs

Salut Audrey,
Salut l'équipe,

les Classes, je n'ai jamais étudié donc, je bricole... et j'utiliserais cette méthode moi-même... à condition de ne pas avoir des centaines de contrôles à gérer... quoique, si tu es patiente...

Le tout est de donner le même nom à chaque Label avec, évidemment, un numéro d'index différent, cela va sans dire.
Dès que l'utilisateur clique sur une TextBox ou une ComboBox, la même procédure est appelée en passant son n° d'index en argument, ce même argument étant alors placé dans une Label SPY invisible.

Un clic sur la feuille ouvre l'USF.

Public Sub Allumer(ByVal iIdx%)
'
If Val(Me.lblSPY.Caption) > 0 Then Me.Controls("Label" & Val(Me.lblSPY.Caption)).ForeColor = &H0
Me.Controls("Label" & iIdx).ForeColor = &HFF
Me.lblSPY.Caption = CStr(iIdx)
'
End Sub
14audrey.xlsm (17.75 Ko)


A+

Bonjour le fil, bonjour le forum,

En pièce jointe une proposition avec deux Modules de classes. Peut-être cela t'inspirera pour ton propre fichier...

34audrey-ep-v01.xlsm (25.51 Ko)

[Édition]
Trop bien le code de Curulis !...

Merci pour vos réponses rapides !

encore 1 question pour thauThème :

Vous avez-mis le code à l'évènement Change mais je souhaiterais que la procédure se lance à l'évènement Enter autant pour les TextBox que les ComboBox

Est-possible ?

Mon code doit se lancer dès que je sélectionne un contrôle sans forcément le modifier. J'ai besoin de ce module de classe pour d'autres applications par la suite donc l'évènement Change n'est pas possible dans mon cas.

Et je dois pouvoir naviguer entre les contrôles soit par un clic de la souris, soit par un Tab donc le MouseDown ou le KeyDown ne sont pas non plus la solution...

Merci

PS: sinon la création du module de classe fonctionne très bien !

Re,

Malheureusement tous les événements et notamment Enter et Exit ne sont pas accessibles via les modules de Classes. J'ai lu qu'il y avait une solution mais je ne l'ai pas gardée car elle dépassait largement mes compétences en VBA...

Merci de la réponse,

Je viens de lire qu'on pouvait utiliser l'évènement enter sur une Collection.

Mais là encore, je ne sais pas du tout comment intégrer une collection à mon code.

Une idée ?

Re,

Hélas non...

Salut Audrey,
Salut ThauThème,

finalement, les modules de classe m'ont l'air bête comme chou : je m'en veux de ne pas m'être penché dessus plus tôt.
J'y chipoterai tout à l'heure en soirée. Merci de ce bel exemple pratico-pratique, ThauThème !

Audrey, tu peux utiliser l'événement MOUSEUP en guise d'activation de tes contrôles avec le même code de ThauThème.

Private Sub CB_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'
Dim CTRL As Control
'
For Each CTRL In UserForm1.Controls
    If TypeOf CTRL Is MSForms.Label Then CTRL.BackColor = &H8000000F
Next CTRL
UserForm1.Controls("L" & Me.CB.Name).BackColor = &HFF&
'
End Sub


A+

Rechercher des sujets similaires à "assigner meme procedure tous controles userform"