Bienvenue dans ce tutoriel dédié à la suppression des doublons dans les ComboBox
et ListBox
en VBA. Que ce soit pour une liste alimentée depuis une plage Excel, un import ou des saisies successives, les doublons nuisent à la lisibilité et à l’expérience. Ci-dessous, vous trouverez 3 méthodes complémentaires: la boucle simple (passe-partout), la Collection (rapide à coder) et le Dictionnaire (efficace sur les grandes listes), avec des options pour ignorer la casse, supprimer les espaces et choisir la colonne de comparaison.
Sommaire
Méthode 1 – Boucle imbriquée (simple et universelle)
La version "classique", améliorée pour être plus robuste (types Long
, comparaison maîtrisée, options de normalisation). Ce code est prêt à être ajouter dans votre projet. Vous pouvez simplement le copier / coller tel qu'il est.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
' Nettoie les doublons dans une ListBox/ComboBox (monocolonne ou multi-colonnes via colIndex) ' Options : ' - colIndex : colonne à comparer (0 = première colonne) ' - ignoreCase : True pour ignorer la casse (A = a) ' - trimSpaces : True pour supprimer les espaces superflus ' par Excel-Malin.com ( https://excel-malin.com ) - Septembre 2025 Sub CtrlSupprimerDoublons_Boucle(ByVal Ctrl As Object, _ Optional ByVal colIndex As Long = 0, _ Optional ByVal ignoreCase As Boolean = True, _ Optional ByVal trimSpaces As Boolean = True) Dim i As Long, j As Long Dim vi As String, vj As String Dim cmp As Long If Ctrl.ListCount < 2 Then Exit Sub For i = 0 To Ctrl.ListCount - 1 vi = ValeurPourComparaison(Ctrl, i, colIndex, ignoreCase, trimSpaces) For j = i + 1 To Ctrl.ListCount - 1 vj = ValeurPourComparaison(Ctrl, j, colIndex, ignoreCase, trimSpaces) If ignoreCase Then cmp = StrComp(vi, vj, vbTextCompare) Else cmp = StrComp(vi, vj, vbBinaryCompare) End If If cmp = 0 Then Ctrl.RemoveItem j j = j - 1 End If Next j Next i End Sub ' Récupère la valeur à comparer (gère mono/multi-colonnes + normalisation) Private Function ValeurPourComparaison(ByVal Ctrl As Object, ByVal rowIndex As Long, _ ByVal colIndex As Long, ByVal ignoreCase As Boolean, _ ByVal trimSpaces As Boolean) As String Dim v As String On Error Resume Next v = Ctrl.List(rowIndex, colIndex) If Err.Number <> 0 Then ' Cas des contrôles monocolonnes (List(row) retourne la valeur) Err.Clear v = Ctrl.List(rowIndex) End If On Error GoTo 0 If trimSpaces Then v = Trim$(v) If ignoreCase Then v = LCase$(v) ValeurPourComparaison = v End Function |
Exemple d’utilisation avec ListBox
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub Exemple_Boucle_ListBox() Dim lb As MSForms.ListBox Set lb = UserForm1.MaListe1 ' adaptez noms With lb .AddItem "Article A" .AddItem "Article B" .AddItem "Article A " ' espaces .AddItem "article a" ' casse différente .AddItem "Article C" .AddItem "Article B" End With ' Compare sur la première colonne (0), ignore casse, supprime espaces CtrlSupprimerDoublons_Boucle lb, 0, True, True End Sub |
Exemple d’utilisation avec ComboBox
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub Exemple_Boucle_Combo() Dim cb As MSForms.ComboBox Set cb = UserForm1.MaCombo1 With cb .AddItem "Paris" .AddItem "paris" .AddItem "Lyon" .AddItem "Lyon " End With CtrlSupprimerDoublons_Boucle cb, 0, True, True End Sub |
Méthode 2 – Collection (courte et efficace)
La technique consiste à exploiter l'unicité des clés d'une Collection
: on tente d'y ajouter chaque valeur avec une clé égale à la valeur normalisée. En cas de doublon, une erreur survient et l'élément n'est pas ajouté une deuxième fois. De cette manière, on se retrouve avec une liste "nettoyée".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
Sub CtrlSupprimerDoublons_Collection(ByVal Ctrl As Object, _ Optional ByVal colIndex As Long = 0, _ Optional ByVal ignoreCase As Boolean = True, _ Optional ByVal trimSpaces As Boolean = True) ' par Excel-Malin.com ( https://excel-malin.com ) - Septembre 2025 Dim i As Long Dim c As New Collection Dim key As String, v As String Dim items() As String Dim countUniq As Long If Ctrl.ListCount = 0 Then Exit Sub ReDim items(0 To Ctrl.ListCount - 1) ' Collecte des uniques For i = 0 To Ctrl.ListCount - 1 v = ValeurPourComparaison(Ctrl, i, colIndex, ignoreCase, trimSpaces) key = v On Error Resume Next c.Add v, key If Err.Number = 0 Then items(countUniq) = Ctrl.List(i) ' on stocke la ligne visible (première colonne) countUniq = countUniq + 1 End If Err.Clear On Error GoTo 0 Next i ' Réécrit la liste (uniques) Ctrl.Clear For i = 0 To countUniq - 1 Ctrl.AddItem items(i) Next i End Sub |
Exemple d’utilisation
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub Exemple_Collection_ListBox() Dim lb As MSForms.ListBox Set lb = UserForm1.MaListe1 With lb .AddItem "A" .AddItem "B" .AddItem "a" .AddItem "B " .AddItem "C" End With CtrlSupprimerDoublons_Collection lb, 0, True, True End Sub |
Méthode 3 – Dictionnaire (la plus performante sur grandes listes)
Le Dictionnaire (Scripting.Dictionary
) permet un accès clé/valeur très rapide. On l'utilise pour marquer ce que l'on a déjà vu avec une clé basée sur la valeur normalisée. Voir l’article dédié au Dictionnaire.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
' par Excel-Malin.com ( https://excel-malin.com ) - Septembre 2025 ' Version late-binding (pas besoin d’ajouter de référence) Sub CtrlSupprimerDoublons_Dictionary(ByVal Ctrl As Object, _ Optional ByVal colIndex As Long = 0, _ Optional ByVal ignoreCase As Boolean = True, _ Optional ByVal trimSpaces As Boolean = True) Dim dict As Object Dim i As Long, c As Long Dim key As String, v As String Dim arr As Variant If Ctrl.ListCount = 0 Then Exit Sub Set dict = CreateObject("Scripting.Dictionary") dict.RemoveAll ' Copie la liste existante en tableau (plus rapide si multi-colonnes) arr = Ctrl.List ' Si monocolonne, arr est 1D ; si multi-colonnes, arr est 2D For i = 0 To Ctrl.ListCount - 1 v = ValeurPourComparaison(Ctrl, i, colIndex, ignoreCase, trimSpaces) key = v If Not dict.Exists(key) Then dict.Add key, i ' stocke l’index original End If Next i ' Réécrit uniquement les uniques en préservant toutes les colonnes Ctrl.Clear For Each key In dict.Keys i = dict(key) If IsArray(arr) Then ' Multi-colonnes : réinjecte la ligne complète Ctrl.AddItem arr(i, 0) For c = 1 To Ctrl.ColumnCount - 1 On Error Resume Next Ctrl.List(Ctrl.ListCount - 1, c) = arr(i, c) On Error GoTo 0 Next c Else ' Mono-colonne Ctrl.AddItem Ctrl.List(i) End If Next key End Sub |
Exemple d’utilisation avec ListBox multi-colonnes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub Exemple_Dictionary_ListBox_Multi() Dim lb As MSForms.ListBox Set lb = UserForm1.MaListe2 ' Suppose une ListBox à 2 colonnes (Produit, Code) lb.ColumnCount = 2 lb.AddItem "Stylo": lb.List(lb.ListCount - 1, 1) = "A01" lb.AddItem "Stylo ": lb.List(lb.ListCount - 1, 1) = "A01" ' espace lb.AddItem "Crayon": lb.List(lb.ListCount - 1, 1) = "B02" lb.AddItem "stylo": lb.List(lb.ListCount - 1, 1) = "A01" ' casse ' Déduplique sur la colonne 1 (index 1 = Code), ignore casse/espaces CtrlSupprimerDoublons_Dictionary lb, 1, True, True End Sub |
Bonnes pratiques
Quelques conseils pratiques pour vous éviter des mauvaises surprises quand vous travaillez avec les listes en VBA.
- Vider la liste avant de la remplir :
Ctrl.Clear
pour éviter d'empiler des doublons. - Normaliser : casse (
LCase$
), espaces (Trim$
), éventuellement remplacer doubles espaces. - Choisir la bonne colonne en multi-colonnes (
colIndex
), selon vos besoins. Sachez que, en VBA, la première colonne a, par défaut, l'index = 0! - Sources de données : si vous partez d'une plage Excel, vous pouvez dédupliquer en amont (Power Query,
Range.RemoveDuplicates
) puis charger la liste.
FAQ rapide
• Dois-je cocher une référence pour le Dictionnaire ?
Non avec la version late-binding (CreateObject("Scripting.Dictionary")
), ce n'est pas nécessaire. Si vous préférez le early-binding, cochez la référence "Microsoft Scripting Runtime".
• Comment gérer les valeurs NULL/vides ?
Vous pouvez tester If Len(Trim$(val)) = 0 Then
pour les ignorer ou les conserver selon le besoin.
Conclusion
Vous avez maintenant trois approches pour enlever les doublons dans vos ComboBox
et ListBox
: la boucle (universelle), la Collection (très concise) et le Dictionnaire (rapide sur gros volumes). À vous de choisir celle qui colle le mieux à votre contexte.
Pour aller plus loin en VBA
Pour finir, voici encore quelques articles qui pourraient vous être utiles pour votre travail avec VBA…
- Liste de toutes les fonctions disponibles en VBA
- Manipulation des fichiers en VBA
- Comment utiliser RECHERCHEV en VBA
- La structure Dictionnaire en VBA
- Code VBA pour envoyer un email
- Ouvrir un fichier en VBA (n'importe quel type de fichier, pas seulement un classeur Excel)