Combo et doublons
Résolu
skyzino
Messages postés
28
Date d'inscription
Statut
Membre
Dernière intervention
-
Patrice33740 Messages postés 8561 Date d'inscription Statut Membre Dernière intervention -
Patrice33740 Messages postés 8561 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Combo et doublons
- Doublons photos - Guide
- Combo de clips story facebook - Guide
- Supprimer les doublons excel - Guide
- Supprimer les doublons photos gratuit - Télécharger - Nettoyage
- Supprimer doublons word ✓ - Forum Word
4 réponses
Bonjour,
Tout d'abord, ajouter une référence à Microsoft Scripting Runtime (Outils/Références..)
Si les noms sont triés :
Si il faut aussi trier les noms :
Tout d'abord, ajouter une référence à Microsoft Scripting Runtime (Outils/Références..)
Si les noms sont triés :
Private Sub UserForm_Initialize() Dim d As New Scripting.Dictionary Dim c As Range NomUtilisateur = "Feuil1" 'Alimentation des noms à partir de la feuille (NomUtilisateur) Sheets(NomUtilisateur).Activate D_L = Range("E" & Rows.Count).End(xlUp).Row 'Dictionnaire sans doublons For Each c In Range(Cells(2, "E"), Cells(D_L, "E")).Cells If Not d.Exists(c.Value) Then d.Add c.Value, "" Next c 'Définition liste combo ComboBox2.List =d.Keys End Sub
Si il faut aussi trier les noms :
Private Sub UserForm_Initialize() Dim d As New Scripting.Dictionary Dim t As Variant Dim c As Range NomUtilisateur = "Feuil1" 'Alimentation des noms à partir de la feuille (NomUtilisateur) Sheets(NomUtilisateur).Activate D_L = Range("E" & Rows.Count).End(xlUp).Row 'Dictionnaire sans doublons For Each c In Range(Cells(2, "E"), Cells(D_L, "E")).Cells If Not d.Exists(c.Value) Then d.Add c.Value, "" Next c 'Tableau à trier t = d.Keys d.RemoveAll 'Tri Call Tri(t, LBound(t), UBound(t)) 'Definition liste combo ComboBox2.List = t End Sub Private Sub Tri(table As Variant, premier As Integer, dernier As Integer) ' Tri rapide (Quick sort), répartit les éléments de part et d'autre d'un pivot médian : ' - éléments inférieurs, avant le pivot ' - éléments supérieurs, après le pivot ' S'appelle récursivement pour chaque partie jusqu'à ce que chaque éléments soit en place. ' ' Arguments : table [in/out] Table à trier ' premier [in] index du premier élément à trier ' dernier [in] index du dernier élément à trier ' Dim pivot As Variant Dim temp As Variant Dim p As Integer Dim d As Integer p = premier d = dernier pivot = table((p + d) \ 2) Do Do While table(p) < pivot p = p + 1 Loop Do While pivot < table(d) d = d - 1 Loop If p <= d Then 'permuter temp = table(p): table(p) = table(d): table(d) = temp p = p + 1 d = d - 1 End If Loop While p <= d 'Appels récursifs If p < dernier Then Call Tri(table, p, dernier) If premier < d Then Call Tri(table, premier, d) End Sub
Bonjour le forum, bonjour Patrice,
Ce que tu propose là me paraît vachement compliqué par rapport à ce que je veux faire.
Simplement si valeur existe déjà dans la combo alors ne s'inscrit pas. N'y a-t-il pas plus simple que cela comme code ?
Merci
Ce que tu propose là me paraît vachement compliqué par rapport à ce que je veux faire.
Simplement si valeur existe déjà dans la combo alors ne s'inscrit pas. N'y a-t-il pas plus simple que cela comme code ?
Merci
Bonjour,
Avec simplement 8 lignes de code, la première procédure (sans trier les noms) est relativement simple.
comme tu veux que le contenu du combobox soit différent de la plage source (par exemple en supprimant les doublons) il faut créer la liste des valeurs. Cette méthode est des plus simples et en plus, elle est particulièrement rapide
La seconde proposition n'est utile que si les noms de la liste doivent être triés par ordre croissant. Comme son nom l'indique le Quick Sort est un tri rapide.
Patrice
Avec simplement 8 lignes de code, la première procédure (sans trier les noms) est relativement simple.
comme tu veux que le contenu du combobox soit différent de la plage source (par exemple en supprimant les doublons) il faut créer la liste des valeurs. Cette méthode est des plus simples et en plus, elle est particulièrement rapide
La seconde proposition n'est utile que si les noms de la liste doivent être triés par ordre croissant. Comme son nom l'indique le Quick Sort est un tri rapide.
Patrice
Bonjour, bonjour Patrice,
J'aurais bien une solution plus simple ! :-)
Et si tu veux par ordre alpha, tu met la propriété "Sort" du combo à True
@+
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
Note: Je ne répond pas aux MP pour les questions techniques. Et ma boule de cristal est cassée .
J'aurais bien une solution plus simple ! :-)
Option Explicit Option Compare Text 'Ne fait pas de différence entre Maju et Minus. Sub InitCombo() Dim Lig As Long, D_L As Long With Sheets(NomUtilisateur) 'Selection de la derniere ligne utilisée colonne de la feuille FTP D_L = .Range("E" & Rows.Count).End(xlUp).Row 'Definition liste combo For Lig = 2 To D_L ComboBox2.Text = .Cells(Lig, 5) If ComboBox2.ListIndex < 0 Then ComboBox2.AddItem .Cells(Lig, 5) End If Next Lig End With End Sub
Et si tu veux par ordre alpha, tu met la propriété "Sort" du combo à True
@+
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
Note: Je ne répond pas aux MP pour les questions techniques. Et ma boule de cristal est cassée .
Bonjour lermite222,
Je dirais aussi simple mais tellement plus lent !!!
Avec un dictionnaire c'est 10 à 12 fois plus rapide. Regarde ce test :
https://www.cjoint.com/c/CFAslMgNdvG
Cordialement
Patrice
PS je n'ai pas de propriété Sort dans mes Combo (MSform), quel type de combo utilises-tu ?
Je dirais aussi simple mais tellement plus lent !!!
Avec un dictionnaire c'est 10 à 12 fois plus rapide. Regarde ce test :
https://www.cjoint.com/c/CFAslMgNdvG
Cordialement
Patrice
PS je n'ai pas de propriété Sort dans mes Combo (MSform), quel type de combo utilises-tu ?
Re,
je suppose que tu veux rire là...
En règle générale ont met quelque lignes dans un combo sinon où est l'avantage.
Que ça mette 120 milliardièmes de seconde à la place de 10.. personnellement je ne vois pas de différence..
Pour la propriété Sorted, j'ai confondu avec VB6 , c'est d'ailleurs pour cela que je suis intervenu sur ce topic. :-(
A+
je suppose que tu veux rire là...
En règle générale ont met quelque lignes dans un combo sinon où est l'avantage.
Que ça mette 120 milliardièmes de seconde à la place de 10.. personnellement je ne vois pas de différence..
Pour la propriété Sorted, j'ai confondu avec VB6 , c'est d'ailleurs pour cela que je suis intervenu sur ce topic. :-(
A+