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 Subensuite, 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 SubLa 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.MaProcQue 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 SUbil 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 SubIl 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 SubCelui 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 SubAttention 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 KCela 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 KTon 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 KIl 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 CtrlCela 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 IfEffectivement 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