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 If

Mais 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...

74jpb-v01.xlsm (35.74 Ko)

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 Sub

Comment savoir quel ComboBox a créé l’événement ?

Merci pour l'aide

Re,

La version 02 avec module de classe...

68jpb-v02.xlsm (31.62 Ko)

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 Sub

Voici 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 Sub

Et 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

Rechercher des sujets similaires à "syntaxe generaliser code combobox"