Syntaxe pour généraliser un code pour les ComboBox
Bonjour,
J’ai besoin d’aide concernant la syntaxe d’un bout de code que je voudrais généraliser
Dans un UserForm, j’ai des Combobox auquel je veux pouvoir ajouter des choix supplémentaires à la liste déroulante.
Les listes déroulantes se trouvent dans la feuille « Liste_à_Choix » et se présentent comme suit avant et après un ajout d’un nouveau choix :
' Avant Après
' Choix1 Choix1
' Choix2 Choix2
' Choix3 Choix 3
' --- new --- Nouveau choix
' --- new ---PS: ??? Comment gérer les espaces dans ce forum ????
Voici le code que j’ai écrit et qui remplit ma demande.
Dim New_input1 As String
Dim K As Integer
New_input1 = InputBox("Quel choix voulez-vous ajouter ?", "Nouveau choix pour le boitier") ' La variable reçoit la valeur entrée dans l'InputBox
If New_input1 <> "" Then ' Si la valeur est différente de "" on affiche le résultat
Sheets("Liste_à_choix").Cells(8, 2).End(xlDown).Offset(0, 0).Value = New_input1 ' écrit le nouveau choix
Sheets("Liste_à_choix").Cells(8, 2).End(xlDown).Offset(1, 0).Value = "--- new ---" ' ré-écrit à la fin de nouveau le "--- new ---"
K = ComboBox1.ListIndex ' list index actuel (New_input1)
Me.ComboBox1.RowSource = "Liste_à_choix!B8:B" & Sheets("Liste_à_choix").Cells(8, 2).End(xlDown).Row ' recharge des choix complets du Combobox
Else
ComboBox1.ListIndex = 0
MsgBox ("on a annulé")
End IfMais comme j’ai plusieurs ComboBox, j’aimerais automatiser ce code et ne pas devoir l’écrire pour chaque ComboBox du projet.
La question est donc comme réécrire ce code mais avec des variables avec par exemple
I = Numéro du ComboBox (= 1 dans mon code)
L et C = Cell(L,C) pour « ligne » et « colonne » de la cellule de départ de ma liste déroulante (= Cells (8, 2) dans mon code)
Et puis comment traduire les B8 et B de "Liste_à_choix!B8:B" en lignes et colonnes de type L et C ???
Je ne sais pas si j’ai été clair mais en tout cas un grand merci de votre coup de main car cela dépasse mes compétences.
Bonjour JPB, bonjour le forum,
Un petit exemple commenté en pièce jointe avec 4 comboboxes . Si tu as beaucoup de comboboxes, il faudrait passer par un Module de Classe pour éviter d'écrire la procédure Change de chacune d'entre elles...
Bonjour et un grand merci pour tout cet exemple (qui fonctionne tres bien
J’étudie cela et j'essaie de l'adapter à mon projet.
Encore une question:
J'ai déjà déclaré un module de classe avec les ComboBox (code ci-dessous)
Public WithEvents GroupeTxt As MSForms.TextBox
Public WithEvents GroupeCombo As MSForms.ComboBox
Private Sub GroupeTxt_Change() ' cette procedure est appellée si un TextBox quelconque est modifié
UserForm1.TB_a_changé = True ' un textBox a changé
End Sub
Private Sub GroupeCombo_Click() ' cette procedure est appellée si un ComboBox quelconque est modifié
UserForm1.CB_a_changé = True ' Un ComboBox a changé
If UserForm1.ComboBox1.Value = "--- new ---" Then ' test si on a cliqué sur "--- new ---"
UserForm1.New_Choice ' appelle la routine
End If
End SubComment savoir quel ComboBox a créé l’événement ?
Merci pour l'aide
Bonjour,
J'ai testé, cela marche très bien dans ton exemple.
Dans mon soft il y a une erreur d’exécution "13" "incompatibilité de type" lors de l'appel de la routine "NewItem (GroupeCombo.Tag)"
Ici:
Private Sub GroupeCombo_Change()
' si le choix est "--- new ---", appelle la procédure [NewItem]
If GroupeCombo.Value = "--- new ---" Then NewItem (GroupeCombo.Tag)
End SubVoici le code complet que j'ai écrit dans le module de classe (En fait que toi tu as écrit
Public WithEvents GroupeTxt As MSForms.TextBox
Public WithEvents GroupeCombo As MSForms.ComboBox
Private Sub GroupeTxt_Change() ' cette procedure est appellée si un TextBox quelconque est modifié
UserForm1.TB_a_changé = True
End Sub
Private Sub GroupeCombo_Click() ' cette procedure est appellée si un ComboBox quelconque est modifié
UserForm1.CB_a_changé = True ' un des ComboBox a changé
' If GroupeCombo.Value = "--- new ---" Then ' si un des combobox vaut "--- new ---"
' NewItem (GroupeCombo.Tag) ' appelle la routine qui ajoute un choix à l'une des liste déroulante
' End If
End Sub
Private Sub GroupeCombo_Change()
' si le choix est "--- new ---", appelle la procédure [NewItem]
If GroupeCombo.Value = "--- new ---" Then NewItem (GroupeCombo.Tag)
End Sub
Private Sub NewItem(Tag As Byte)
Dim L As Worksheet 'déclare la variable L (onglet "Liste_à_choix")
Dim BE As Variant 'déclare la variable BE (Boîte d'Entrée)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Set L = Worksheets("Liste_à_choix") 'définit l'onglet L
'définit la bôite d'entrée BE
BE = Application.InputBox("Quel choix voulez-vous ajouter ?", "Nouveau choix pour le boitier", Type:=2) ' La variable reçoit la valeur entrée dans l'InputBox
If BE = False Or BE = "" Then Exit Sub 'si bouton [Annuler] ou non renseignée, sort de la procédure
DL = L.Cells(Application.Rows.Count, Tag).End(xlUp).Row 'définit la dernière ligne éditée de la colonne Tag de l'onglet L
MsgBox ("derniere ligne = " & DL)
L.Cells(DL, Tag).Value = BE 'renvoie la valeur de BE dans la cellule ligne DL, colonne Tag
L.Cells(DL + 1, Tag) = "'--- new ---" 'écrit dans la cellule ligne DL+1, colonne Tag
' L.Range(L.Cells(2, Tag), L.Cells(DL, Tag)).Sort L.Cells(1, Tag) 'classe par ordre coissant la colonne Tag
' Unload UserForm1 'vide et ferme l'UserForm1
' UserForm1.Show 'affiche l'UserForm1 (actualisé)
End SubEt je ne vois pas ou est le problème.
Une fois que cela marchera je regrouperai les deux "event" "GroupeCombo_Click()" et "GroupeCombo_Change()"
Merci pour ton aide
Re,
Est-ce que tu as bien attribué à la propriété [Tag] de tes comboboxes, le numéro de la colonne qui les alimente, comme je le définit dans l'initialisation de l'UserForm ?
Me.ComboBox1.Tag = 1 'définit la propriété [Tag] de la ComboBox1 (elle correspond au numéro de la colonne qui l'alimente)
Me.ComboBox2.Tag = 2 'définit la propriété [Tag] de la ComboBox2 (elle correspond au numéro de la colonne qui l'alimente)
Me.ComboBox3.Tag = 3 'définit la propriété [Tag] de la ComboBox3 (elle correspond au numéro de la colonne qui l'alimente)
Me.ComboBox4.Tag = 4 'définit la propriété [Tag] de la ComboBox4 (elle correspond au numéro de la colonne qui l'alimente)Je ne vois pas pourquoi ça ne fonctionne pas chez toi ?!... Comme [Tag] renvoie un valeur de type String, on peut aussi modifier dans le module de classe :
If GroupeCombo.Value = "--- new ---" Then NewItem (CByte(GroupeCombo.Tag))Mais chez moi ça marchait sans avoir besoin de convertir...
Si tu envoyais ton fichier on irait certainement plus vite !...
Effectivement je n'ai pas fait les initialisations
J'y retourne !
et je te tiens au courant
Bonjour,
Effectivement tout était juste.
J'avais bêtement oublié les initialisations.
Plus quelques autres problèmes chez moi.
Maintenant tout roule
Encore un grand merci pour toute cette aide
Je mets "résolu" et te souhaite une bonne semaine
Jean-pierre