IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Enlever les doublons dans une combobox [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Mécanicien avion
    Inscrit en
    Février 2018
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Mécanicien avion

    Informations forums :
    Inscription : Février 2018
    Messages : 193
    Par défaut Enlever les doublons dans une combobox
    Bonjour à tous,

    J'ai un code qui me permet de charger ma combobox par ordre alphabétique.
    Est-il possible d'enlever les doublons en plus ?

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Private Sub UserForm_Initialize()
        Dim plage As Integer, PlageTri As Integer
        Dim base As String
     
        Set ws = Sheets("Synthèse")
     
        With Me.ComboBoxSouhait1
            For plage = 5 To 40
            Text = ws.Cells(plage, 1)
                If Text <> "" And ws.Cells(plage, 4) > 0 Then
                    .AddItem ws.Range("A" & plage)
                End If
            Next plage
        End With
     
            For plage = 0 To ComboBoxSouhait1.ListCount - 1
            For PlageTri = 0 To ComboBoxSouhait1.ListCount - 1
                If ComboBoxSouhait1.List(plage) < ComboBoxSouhait1.List(PlageTri) Then
                    base = ComboBoxSouhait1.List(plage)
                    ComboBoxSouhait1.List(plage) = ComboBoxSouhait1.List(PlageTri)
                    ComboBoxSouhait1.List(PlageTri) = base
                End If
            Next PlageTri
            Next plage
     
    End Sub
    Merci pour votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    tu as deux moments pour faire ton test de doublon.

    - soit lorsque tu alimentes ta combobox, en vérifiant que la valeur n,est pas déjà parmi celles de ta combobox

    - soit une fois que tu as alimenté ta combobox, tu supprimes les items qui seraient déjà apparus

    Ton avantage ici c'est que si tes données sont déjà dans le bon ordre, il suffit de comparer ta valeur i et i-1 en faisant une boucle décrémentée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = ComboBoxSouhait1.Count to 1 Step -1
        ' ton test de comparaison + suppression le cas échéant
    Next i
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Bonjour, voici une suggestion avec utilisation d'une Collection. Les doublons sont automatiquement gérés car une Collection ne peut pas avoir de clés dupliquées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Private Sub UserForm_Initialize()
        Dim plage As Integer
        Dim base As String
        Dim ws As Worksheet
        Dim itemsCollection As Collection
        Dim item As Variant
        Dim i As Integer, j As Integer
        Dim temp As String
     
        Set ws = Sheets("Synthèse")
        Set itemsCollection = New Collection
     
        ' Gérer les erreurs pour ignorer les doublons
        On Error Resume Next
     
        ' Ajouter les valeurs uniques à la collection
        For plage = 5 To 40
            base = ws.Cells(plage, 1).Value
            If base <> "" And ws.Cells(plage, 4).Value > 0 Then
                itemsCollection.Add base, CStr(base)
            End If
        Next plage
     
        On Error GoTo 0
     
        For Each item In itemsCollection
            Me.ComboBoxSouhait1.AddItem item
        Next item
     
        For i = 0 To Me.ComboBoxSouhait1.ListCount - 2
            For j = i + 1 To Me.ComboBoxSouhait1.ListCount - 1
                If Me.ComboBoxSouhait1.List(i) > Me.ComboBoxSouhait1.List(j) Then
                    temp = Me.ComboBoxSouhait1.List(i)
                    Me.ComboBoxSouhait1.List(i) = Me.ComboBoxSouhait1.List(j)
                    Me.ComboBoxSouhait1.List(j) = temp
                End If
            Next j
        Next i
    End Sub

  4. #4
    Membre confirmé
    Homme Profil pro
    Mécanicien avion
    Inscrit en
    Février 2018
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Mécanicien avion

    Informations forums :
    Inscription : Février 2018
    Messages : 193
    Par défaut
    Merci pour vos réponse, une fois de plus vous avez assuré.

    Je n'ai pas réussi avec .count mais la collection, c'est nickel.

    Encore merci pour votre aide.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    836
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 836
    Par défaut
    Bonjour @ tous,

    Vaut mieux tard que jamais, voici une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Dim i As Long, j As Long
        With Me.ListBox1
            For i = 0 To .ListCount - 1
                For j = .ListCount - 1 To (i + 1) Step -1
                    If .List(j) = .List(i) Then
                        .RemoveItem j
                    End If
                Next
            Next
        End With

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Hello,

    Citation Envoyé par modus57 Voir le message
    Bonjour @ tous,

    Vaut mieux tard que jamais, voici une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Dim i As Long, j As Long
        With Me.ListBox1
            For i = 0 To .ListCount - 1
                For j = .ListCount - 1 To (i + 1) Step -1
                    If .List(j) = .List(i) Then
                        .RemoveItem j
                    End If
                Next
            Next
        End With
    La collection est plus performante et le code est plus simple (une seule boucle),
    De plus, si le besoin de respecter la casse se fait sentir, on peut passer par un dictionnaire (Scripting.Dictionary).

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    836
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 836
    Par défaut
    Bonjour deedolith,

    Effectivement avec un ComboBox si la quantité de données est très importantes la collection est plus performante.

    Ma solution fonctionne aussi avec une ListBox multicolonne, mais je n’ai pas testé avec une importantes source de données.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    836
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 836
    Par défaut
    Bonsoir,

    Voici une solution avec un dictionnaire et choix de la colonne qui devra supprimer les doublons dans une ListBox multicolonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Dim f
    Private Sub UserForm_Initialize()
        Me.ListBox1.ColumnCount = 5
        Me.ListBox1.ColumnWidths = ("40;40;40;40;50")
        Me.ListBox1.List = Range("Tableau3").Value
        Set d = CreateObject("Scripting.Dictionary")
        J = 0
        Do While J < Me.ListBox1.ListCount
            'tmp = ListBox1.List(J, 0)  'supprime doublons colonne 1
            'tmp = ListBox1.List(J, 1)  'supprime doublons colonne 2
            tmp = ListBox1.List(J, 2)  'supprime doublons colonne 3
            'tmp = ListBox1.List(J, 3)  'supprime doublons colonne 4
            'tmp = ListBox1.List(J, 4)  'supprime doublons colonne 5
            If Not d.exists(tmp) Then
                d(tmp) = ""
                J = J + 1
            Else
                Me.ListBox1.RemoveItem J
            End If
        Loop
    End Sub
    Tester avec un tableau structuré + de 3000 lignes c'est quasiment instantané.

  9. #9
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    je n'es pas testé sur un grande quantité de données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Sub AjouterDichotomique(Combo As ComboBox, Element As String)
        Dim Bas As Long, Haut As Long, Milieu As Long
        Dim Position As Long
     
        Bas = 0
        Haut = Combo.ListCount - 1
        Position = -1 ' Par défaut, ajoute à la fin
     
     
        ' Recherche dichotomique
        Do While Bas <= Haut
            Milieu = (Bas + Haut) \ 2
            If StrComp(Combo.List(Milieu), Element, vbTextCompare) > 0 Then
                Haut = Milieu - 1
            ElseIf StrComp(Combo.List(Milieu), Element, vbTextCompare) < 0 Then
                Bas = Milieu + 1
            Else
                Position = Milieu ' Trouvé, évite les doublons
                Exit Do
            End If
        Loop
     
     
        ' Si l'élément n'existe pas, insérer à la bonne position
        If Position = -1 Then
            Position = Bas
            Combo.AddItem Element, Position
        End If
    End Sub
     
     
    ' Exemple d'utilisation
    Sub TestAjouterDichotomique()
        Dim Combo As ComboBox
        Set Combo = UserForm1.ComboBox1 ' Remplacez par votre formulaire/contrôle
     
     
        ' Ajouter des éléments de façon dichotomique
        AjouterDichotomique ComboBox1, "Banane"
        AjouterDichotomique ComboBox1, "Orange"
        AjouterDichotomique ComboBox1, "Pomme"
        AjouterDichotomique ComboBox1, "Cerise"
     
    End Sub
     
     
     
     
    Private Sub UserForm_Initialize()
    TestAjouterDichotomique
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment éviter les doublons dans une ComboBox
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 27/07/2017, 16h03
  2. [PHP 5.0] Enlever les doublons dans une variable
    Par raphy31 dans le forum Langage
    Réponses: 10
    Dernier message: 26/03/2014, 10h10
  3. supprimer les doublons dans une combobox
    Par pierrot67 dans le forum Débuter
    Réponses: 12
    Dernier message: 03/04/2010, 11h05
  4. Enlever les doublons dans une liste
    Par gefrey54 dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 14/09/2007, 17h46
  5. [vbexcel]Comment supprimer les doublons dans une combobox?
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 24/11/2005, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo