Info de changement dans un groupe de "TextBox" ou "ComboBox"

Bonjour,

J’ai un « UserForm1 » avec plusieurs dizaines de « TextBox » et plusieurs « ComboBox » plus quelques commandes.

Je cherche à savoir si j’ai modifié un des Textbox ou un des Combobox pour leur appliquer la même procédure à tous.

Apres recherche sur le net j’ai vu qu’il fallait regrouper les Text et ComboBox sous forme de « classe ».

Mais là je suis perdu, cela dépasse mes connaissances.

Je crée un module de classe « classe1 ». Jusque-là cela va, mais après …

Si j’ai bien compris c’est dans le module « classe1 » que je vais définir ma procédure à exécuter en cas de modifications de mes Text/ComboBox.

Quelle syntaxe pour la définition de la procédure et quel nom lui donner ? (TextBox.change ou .exit) ???

J’ai aussi vu qu’il faut associer les différents TextBox1, 2, 3,… avec cette classe (et aussi les ComboBox).

Comment fait-on cela ? et où ?

Bref je ne sais pas comment faire

Merci pour le coup de main

Jean-Pierre

Bonjour,

C'est assez simple, pour tester, tu colles le code ci-dessous dans le module de classe nommé "Classe1" (nom par défaut) :

Public WithEvents GroupeTxt As MSForms.TextBox
Public WithEvents GroupeCombo As MSForms.ComboBox

Private Sub GroupeCombo_Click()

   MsgBox "Le texte sélectionné du ComboBox '" & GroupeCombo.Name & "' est : " & GroupeCombo.Text

End Sub

Private Sub GroupeTxt_Change()

   MsgBox "Le texte du TextBox '" & GroupeTxt.Name & "' est : " & GroupeTxt.Text

End Sub

ensuite, tu colles le code ci-dessous dans le module de ta Form :

Dim Txt() As New Classe1
Dim Cmb() As New Classe1

Private Sub UserForm_Initialize()

    Dim Ctrl As Control
    Dim I As Integer
    Dim J As Integer

    'parcour les feuilles
    For Each Ctrl In Me.Controls

        If TypeName(Ctrl) = "TextBox" Then

            'stocke le TextBox dans le tableau
            I = I + 1
            ReDim Preserve Txt(1 To I)
            Set Txt(I).GroupeTxt = Ctrl

        End If

        If TypeName(Ctrl) = "ComboBox" Then

            'stocke le ComboBox dans le tableau
            J = J + 1
            ReDim Preserve Cmb(1 To J)
            Set Cmb(J).GroupeCombo = Ctrl

        End If

    Next Ctrl

End Sub

La contrainte est qu'il faut qu'il y ai quelques TextBox et ComboBox sur la Form et que pour voir le fonctionnement des ComboBox, il faut qu'ils aient des valeurs dans leurs liste !

La procédure est très simple, quand tu entres un caractère dans un TextBox, une boite apparaît pour te donner le nom du TextBox et la valeur qu'il contient et pour les ComboBox, c'est le clic dans la liste qui fait afficher la boite !

Je suis de retour,

Un grand merci pour ce code.

Je vais le tester mais ce sera pour demain.

Je te tiens au courant

Bonjour,

J'ai testé dette proposition,elle fonctionne et elle répond parfaitement à ma demande

Encore merci pour le coup de main.

Mais je suis coincé pour aller plus loin car je ne sais pas travailler avec les variables entre le UserForm et les modules de classe.

Je m'explique:

Comment définir une variable (par exemple une integer) qui est accessible à la fois depuis une procédure dans UserForm et depuis une procédure du module de classe.

Par exemple: J'incrémente une variable integer à chaque modification d'un TextBox et j'aimerai la réutiliser dans une procédure de UserForm ?

Comment définir ces variables ?

Autre question: Comment appeler une procédure située dans UserForm depuis le module de classe ?

Bref vous voyez mes connaissance sont très faible, d'où mes demandes "basiques"

Encore une fois merci pour l'aide

Bonjour,

Pour appeler une procédure dans un module autre qu'un module standard (module de feuille, module du classeur, module d'UserForm et module de classe) il faut que la procédure ou fonction soit déclarée "Public" et doit impérativement être précédée du nom de l'objet séparée par un point exactement comme une propriété ou méthode.

Exemple, une procédure nommée "MaProc" est déclarée Public dans le module de l'UserForm1 et bien pour l'appeler, il faut faire :

UserForm1.MaProc

Que ce soit d'un module de classe, d'un module standard ou de tout autre module.

Si cette procédure demande des arguments comme par exemple :

Public Sub MaProc(Cmb As MSForms.ComboBox, MaVar)
'...
'...
End SUb

il suffit de les lui passer comme on le fait pour une procédure située dans un module standard. L'appel ici vient du module de classe et concerne les ComboBox :

Private Sub GroupeCombo_Click()

   UserForm1.MaProc GroupeCombo, GroupeCombo.Text

End Sub

Il en va de même pour une variable propre à l'UserForm. Cette variable doit être déclarée "Public" et pas n'importe où, en tête de module ensuite, elle peut être modifiée partout.

Pour que tu puisses mieux comprendre, tu remplaces tout le code que je t'ai précédemment donné par celui ci-dessous et tu rajoutes deux boutons sur ta Form (nommés CommandButton1 et CommandButton2).

Le code de l'UserForm :

Dim Txt() As New Classe1
Dim Cmb() As New Classe1

Public MaVariableAModifierAilleurs As Integer '<----- déclarée en tête de module

Private Sub CommandButton1_Click()

    MsgBox MaVariableAModifierAilleurs 'une fois un des TextBox alimenté, le clic sur le bouton indique la valeur de la variable initialisé dans le module de classe

End Sub

Private Sub CommandButton2_Click() '<--- ici, le bouton appelle la procédure déclarée Public dans le module de classe

    Dim Cls As New Classe1 'pour la classe, il y a cette particularité, il faut l'instancier
    'un argument est demandé et lui est passé (36)
    Cls.ProcDansMaClasse 36

End Sub

Private Sub UserForm_Initialize()

    Dim Ctrl As Control
    Dim I As Integer
    Dim J As Integer

    'parcour les controles
   For Each Ctrl In Me.Controls

        If TypeName(Ctrl) = "TextBox" Then

            'stocke le TextBox dans le tableau
           I = I + 1
            ReDim Preserve Txt(1 To I)
            Set Txt(I).GroupeTxt = Ctrl

        End If

        If TypeName(Ctrl) = "ComboBox" Then

            'stocke le ComboBox dans le tableau
           J = J + 1
            ReDim Preserve Cmb(1 To J)
            Set Cmb(J).GroupeCombo = Ctrl

        End If

    Next Ctrl

End Sub

Public Sub MaProc(Cmb As MSForms.ComboBox, MaVar) '<-- si le type est omis, la variable est de type Variant, ce qui est le cas ici

    MsgBox "Le Combobox qui m'appelle est " & Cmb.Name & " et la valeur choisie est " & MaVar

End Sub

Celui du module de classe :

Public WithEvents GroupeTxt As MSForms.TextBox
Public WithEvents GroupeCombo As MSForms.ComboBox

Private Sub GroupeCombo_Click()

    UserForm1.MaProc GroupeCombo, GroupeCombo.Text

End Sub

Private Sub GroupeTxt_Change()

    MsgBox "Le texte du TextBox '" & GroupeTxt.Name & "' est : " & GroupeTxt.Text

    UserForm1.MaVariableAModifierAilleurs = 25

End Sub

Public Sub ProcDansMaClasse()

    MsgBox "Tu viens de m'appeler et je suis dans le module de classe !"

End Sub

Attention tout de même, la durée de la variable à l'intérieur de l'UserForm ne sera que de la durée de l'affichage de cet UserForm, une fois fermé, la variable est détruite et n'existe plus au sein du classeur. Si tu veux une durée de niveau classeur, il faut la déclarer dans un module standard de préférence ou dans un module de feuille ou du classeur.

Avec ceci, tu va pouvoir voir l'interconnexion entre tous les modules d'un classeur !

Bon courage

Bonjour,

Merci pour ce cours magistral !

Je vais étudier cela en détail, faire les tests et essayer de l'appliquer à mes besoins.

Je reviendrai certainement avec quelques problèmes ou questions mais je commence par prendre mon courage à deux mains et je me lance.

Encore un grand merci

Jean-Pierre

Aucun problème, reviens dès que tu as besoin !

Bonjour,

J'ai bien étudié et j'ai réussi ce que je voulais faire. Encore un merci pour ce "cours"

Mais j'ai un autre soucis.

Comment charger des valeurs dans des ComboBox ?

(pas les différentes possibilités quelles peuvent prendre, cela j'ai trouvé sur le Net mais la valeur affichée "Me.ComboBox.Value".)

En fait je veux faire ceci:

Me.comboBox1.Value = Cell(1,1)

Me.comboBox2.Value = Cell(1,2)

Me.comboBox3.Value = Cell(1,3)

Me.comboBox4.Value = Cell(1,4)

etc

mais avec une boucle:

For K = 1 to 20
    [b]Me.comboBox & K & .Value = Cell(1,K)[/b] 
Next K

Cela ne marche pas.

Quelle syntaxe utiliser ?

Merci pour le coup de main

Bonjour,

De cette façon :

For K = 1 To 20

    'pour faire une boucle sur les combobox en incrémentant le nom, utilise la propriété "Controls"
    Me.Controls("ComboBox" & K).Value = Cells(1, K).Value

    'ou avec la propriété Text
    'Me.Controls("ComboBox" & K).Text = Cells(1, K).Value

    'ou encore en définissant un élément de la liste
    'Me.Controls("ComboBox" & K).ListIndex = K

Next K

Ton premier code marche mais tu n'as pas mis de s à "Cells", c'est pour ça que ça plante, le compilateur ne connait pas cette propriété (forcément puisqu'elle n'existe pas)

ça par contre, ça ne peut pas du tout marcher :

For K = 1 To 20
    Me.comboBox & K & .Value = Cell(1,K)
Next K

Il te faut utiliser la propriété "Controls" de l'UserForm afin de concaténer le préfixe avec le nombre pour former le nom complet dans une boucle et de plus, tu ne peux pas lier une propriété à un objet avec l'esperluette (&)

C'est un sans fautes

Bravo !

Mon projet avance bien grâce à toi, mais je pense que la prochaine question ne saurait tarder...

Mais je pense qu'il serait mieux d'ouvrir un nouveau sujet pour des questions sans rapport avec ce titre.

Donc je mets celui-ci en résolu et je te remercie encore une fois pour ton aide (qui sera également très appréciée pour mes nouvelles questions à venir)

Bonne journée

Jean-Pierre

Heureux d'avoir pu t'aider jusqu'à présent et effectivement, il est préférable d'ouvrir un nouveau post si tes questions n'ont plus un rapport avec ce sujet

Bonjour,

Je me permet de revenir car j'ai encore un soucis concernant les classes pour les groupes de "TextBox" (Voir la première partie de ce message)

Voici le code que j'ai écrit basé sur ta proposition.

' initialisation des modules "classe1"  (pour les TextBox et les ComboBox)
    Dim Ctrl As Control
    Dim I As Integer
    Dim J As Integer

    For Each Ctrl In Me.Controls    'parcour les feuilles

         If TypeName(Ctrl) = "TextBox" Then     ' stocke le TextBox dans le tableau
            I = I + 1
            ReDim Preserve Txt(1 To I)
            Set Txt(I).GroupeTxt = Ctrl
        End If

        If TypeName(Ctrl) = "ComboBox" Then       ' stocke le ComboBox dans le tableau
            J = J + 1
            ReDim Preserve Cmb(1 To J)
            Set Cmb(J).GroupeCombo = Ctrl
        End If

     Next Ctrl

Cela marche très bien mais j'aimerai exclure la "TextBox1" de cette classe. Je ne veut pas que "TextBox1" me provoque un "event"

Comment faire ?

J'ai bien cherché sur le net mais honnêtement je n'ai pas vraiment compris cette affaire des classes et des variables Control (je suis vraiment débutant).

Merci pour le coup de main

Bonjour,

Avec ceci ça devrait marcher :

If TypeName(Ctrl) = "TextBox" Then

    If Ctrl.Name <> "TextBox1" Then

        'stocke le TextBox dans le tableau
        I = I + 1
        ReDim Preserve Txt(1 To I)
        Set Txt(I).GroupeTxt = Ctrl

    End If

End If

Effectivement cela marche bien. Merci bien

Comme les réponses arrivent toujours justes et utiles je me permet de poursuivre:

Si un des TextBox ou ComboBox change, le système lance un event. C'est très bien comme cela mais peut-on contrôler ce lancement d'event.

Certaines fois j'aimerai que cet event ne soit pas lancé. Comment faire ? Quelle syntaxe utiliser ?

Même question pour un ListBox. Comment controler le lancement de la routine "ListBox1_change()"

Merci pour la suite du coup de main

Rechercher des sujets similaires à "info changement groupe textbox combobox"