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 :

[vbexcel]Comment supprimer les doublons dans une combobox?


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier Avatar de Mugette
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 194
    Points : 80
    Points
    80
    Par défaut [vbexcel]Comment supprimer les doublons dans une combobox?
    Comment supprimer les doublons dans une combobox?

    lorsque je charge les données de ma liste déroulante à partir d'une colonne (d'une autre feuille) que j'ai généré, j'ai des doublons, je voudrais trier cette liste et supprimer les doublons. Pouvez-vous m'aider ?

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour

    ci joint un exemple pour alimenter une ComboBox sans doublons


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For j = 1 To Range("A65536").End(xlUp).Row
    ComboBox1 = Range("A" & j)
    If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Range("A" & j)
    Next j

    cordialement
    michel

  3. #3
    Membre régulier Avatar de Mugette
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 194
    Points : 80
    Points
    80
    Par défaut
    impec SilkyRoad...
    Maintenant t'as pas un script pour les trier ??
    parce que c'est très moche.

  4. #4
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Pour les trier comment? Par ordre alphabétique?
    Si c'est ça, je te conseille de trier dabord ta colonne dans Excel avec la fonction "Sort", et de les insérer ensuite dans ta ComboBox.

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    De mon côté, j'avais ça avec un filtre élaboré hors place, en supposant qu'il n'y ait rien dans la colonne H...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Range("A1").Select
        Selection.CurrentRegion.Select
        Range("A1:A46").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Columns _
            ("A:A"), CopyToRange:=Range("H1"), Unique:=True
        Range("H1").Select
        Plage = "H1:" + Cells(ActiveCell.End(xlDown).Row, acticell.Column).Address
        MonCombo.RowSource = Plage
    Pour les trier, comme tu as la plage, tu intercales
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Range(Plage).select
        Selection.Sort Key1:=Range("H2"), Order1:=xlAscending, Header:=xlGuess, _
            OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    avant d'affecter la plage à ton combo

    A+

  6. #6
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Il est quand même balaizzzze, ce dodo!

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Salut Megaxel, je te renvoie en bas de page...
    http://www.developpez.net/forums/viewtopic.php?t=420758

    A+

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 290
    Points : 374
    Points
    374
    Par défaut
    Bonsoir,
    Dans mon exemple, la liste déroulante est sur un UserForm
    Le Code Rempli un Combobox avec des données de A2 à A 20 qui se trouve dans ma feuille 2 et supprime les doublons au chargement de la Combobox(Idem si c'est une ListBox.)
    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
     
    Sub EliminerDoublons()
    Dim Cell As Range
    Dim NoDupes As New Collection
    Dim Item
    On Error Resume Next
    Sheets("Feuil2").Select
    For Each Cell In Range("A2:A20")
        NoDupes.Add Cell.Value, CStr(Cell.Value)
    Next Cell
    On Error GoTo 0
    For Each Item In NoDupes
        UserForm1.ComboBox1.AddItem Item
        UserForm1.ComboBox1.ListIndex = 0
        Next Item
     
    UserForm1.Show
    End Sub
    jpleroisse

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Hello, leroissejp,
    Généralement je m'inspire de ton code... tout ça pour dire que cette fois-ci, je ne vois pas où tu tries les données...
    Me trompe-je ?

    A+

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 290
    Points : 374
    Points
    374
    Par défaut
    Bonsoir,
    ouskel'n'or, as-tu essayé le code ?, car il fonctionne très bien.

    Ce code réalise une boucle pour chaque cellule dans la plage et ajoute les valeurs des cellules à la collection NoDupes.Il utilise également la valeurs des cellules(convertie en chaîne de caractères) pour l'argument du mot clé(données).
    On Error Resume Next permet de gérer l'erreur VBA qui se produit si la clé n'est pas unique.
    Quand une erreur se produit, l'élément n'est pas ajouter à la collection La procédure transfère alors les éléments de la collection NoDupes vers la zone de liste.

    jpleroisse

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Mugette demandait
    impec SilkyRoad...
    Maintenant t'as pas un script pour les trier ??
    parce que c'est très moche.
    Je parlais de ça. De là à déduire comme Megaxel que Mugette souhaitait un tri alpha... j'ai sauté le pas. Mais comme Mugette ne répond plus, on sait toujours pas.

    Mais bien sûr que ton code est efficace, je ne l'ai jamais mis en doute.

    A+

  12. #12
    Membre régulier Avatar de Mugette
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 194
    Points : 80
    Points
    80
    Par défaut
    désolé les gars, j'était en rtt ....

    alors j'ai lu vos posts mais j'ai trouvé une solution alternative...

    je stocke les valeurs de ma colonne dans un tableau, ensuite je trie et je supprime les doublons puis je charge ce tableau dans ma combobox qui est dans mon userform..

    merci à tous.

    ps : Pour le tri c'est un tri croissant car ce sont des numéros de semaine.

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Hello,
    Alors t'as mal lu... parce que ces lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Range("A1").Select 
        Selection.CurrentRegion.Select 
        Range("A1:A46").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Columns _ 
            ("A:A"), CopyToRange:=Range("H1"), Unique:=True 
        Range("H1").Select 
        Plage = "H1:" + Cells(ActiveCell.End(xlDown).Row, acticell.Column).Address 
        MonCombo.RowSource = Plage
    font précisément ce que tu fais...

    A+

  14. #14
    Membre régulier Avatar de Mugette
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 194
    Points : 80
    Points
    80
    Par défaut
    Peut-tu m'expliquer ton code je comprend pas vraiment ce que tu fais.
    Genre : AdvanceFilter ca sert a quoi ?
    Merci.

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    OK !

    Je fais un filtre élaboré "hors place". C'est à dire qu'au lieu de filtrer et de placer le résultat du filtre sur la plage des données, pour ne pas modifier la base, on colle le résultat du filtre "Ailleurs". Cet "ailleurs là" se trouve obligatoirement sur la même feuille de calcul que les données (office 97 - je ne connais pas les versions ultérieures)
    Donc, "AdvanceFilter", veut dire "Filtre élaboré". Dans Excel, tu trouves ça dans le menu "Données" -> "Filtre" -> "Filtre élaboré"
    Ensuite, si ça te pose problème, tu fais F1...

    Dans mon exemple, je suppose que tu as les données à filtrer dans la colonne A. Mais je m'aperçois que j'ai mis une plage en dur. Je te remets ça avec une plage aléatoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Colonne = "A"   'Colonne sur laquelle tu veux poser le filtre et également colonne du critère de filtre
    Plage = ActiveSheet.Range(Colonne + "1:" + Colonne + CStr(Range(Colonne + "65535").End(xlUp).Row))
    'Ainsi ta plage couvre de A1 à ADernièrecelluleRenseignée

    Je reprends tout avec cette modif

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Colonne = "A"  'que tu modifies en cas de besoin
        Plage = ActiveSheet.Range(Colonne + "1:" + Colonne + CStr(Range(Colonne + "65535").End(xlUp).Row))
        Range(Plage).AdvancedFilter Action:=xlFilterCopy, _
            CriteriaRange:=Columns _ 
            ("A:A"), CopyToRange:=Range("H1"), Unique:=True 
        Range("H1").Select 
        Plage = "H1:" + Cells(ActiveCell.End(xlDown).Row, acticell.Column).Address
        Range(Plage).select  'Je sélectionne la plage pour effectuer le tri
        Selection.Sort Key1:=Range("H2"), Order1:=xlAscending, _
            Header:=xlYes, OrderCustom:=1, MatchCase:=False, _
            Orientation:=xlTopToBottom
        MonCombo.RowSource = Plage
    Attention : j'ai mis "Header:=xlYes" car je suppose que tu as une entête de colonne. Si tu n'en n'as pas, tu mets "Header:=xlNo". Ne laisse pas "Header:=xlGuess" (mis par défaut) car Excel ne sait pas forcément distinguer une entête.
    Enfin, si j'ai choisi la colonne H pour coller le résultat du filtre, c'est que, dans mon exemple, je savais cette colonne entièrement vide.

    Voilà.

    Si tu as encore un pb, tu demandes

    A+

  16. #16
    Membre régulier Avatar de Mugette
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 194
    Points : 80
    Points
    80
    Par défaut
    Ouais ok je comprend mais c'est trop élaboré pour moi...
    Cependant, je cherche une autre solution, qui se prsente comme ça :

    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
     
    Dim i, der_ligne_suivi As Integer
    Dim tab_mois()
     
     
    Public Sub chargement_mois()
     
        Dim n, k As Integer
     
        der_ligne_suivi = 3
        k = 0
     
        While Workbooks("suivi_dds_v0.xls").Worksheets("Délai").Cells(der_ligne_suivi, 12).Value <> ""
            ReDim Preserve tab_mois(k)
            tab_mois(k) = Workbooks("suivi_dds_v0.xls").Worksheets("Délai").Cells(der_ligne_suivi, 12).Text
            der_ligne_suivi = der_ligne_suivi + 1
            k = k + 1
        Wend
     
        For k = 0 To der_ligne_suivi
            If tab_mois(k) = tab_mois(k + 1) Then
                tab_mois(k + 1).Delete//erreur
            End If
            MsgBox tab_mois(k)
        Next k
    End Sub
    mais ca plante sur le delete qui n'existe, c'est la que je voudrais supprimer mes doublons.

    Peut-tu m'aider ??

  17. #17
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    je ne crois pas qu'il existe une fonction pour détruire un élément d'un tableau ...

    en voici une ...:
    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
    Function EffaceElement(lIndex As Long, t()) As Boolean
    Dim i As Long
    If lIndex > UBound(t) Then
      Debug.Print "Erreur index trop grand"
      EffaceElement = False
      Exit Function
    End If
    If lIndex < LBound(t) Then
      Debug.Print "Erreur index trop petit"
      EffaceElement = False
      Exit Function
    End If
    For i = lIndex To UBound(t) - 1
      t(i) = t(i + 1)
     
    Next
    ReDim Preserve t(UBound(t) - 1)
    EffaceElement = True
     
    End Function
    à utiliser dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
        For k = 0 To der_ligne_suivi
            If tab_mois(k) = tab_mois(k + 1) Then
     
                if EffaceElement (k + 1,tab_mois) then
                       der_ligne_suivi = der_ligne_suivi -1
                end if
            End If
            MsgBox tab_mois(k)
        Next k 
    ...
    ... a tester ... [/code]

  18. #18
    Membre régulier Avatar de Mugette
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 194
    Points : 80
    Points
    80
    Par défaut
    oui je vais regarder mais je vais aller manger d'abord....
    merci bbil...

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Une autre méthode consiste à commencer le tri par la dernière ligne, ainsi, les lignes effacées ne foutent pas le bouzzzou dans le N° de ligne

    Un tableau + deux boucles imbriqués :
    - l'une qui lit les lignes "à l'envers" de dernièreLigne à 1
    - l'autre boucle qui vérifie que la donnée n'existe pas dans le tableau.
    Si elle existe, on efface la ligne,
    Si elle n'existe pas, on la mémorise dans le tableau

    pour le tri, leroissejp a mis ça dans un autre poste et ça marche au poil

    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
    Sub Tri() 
    Dim MonTab(5) As String
    Dim x As String
    Dim i As Integer
    Dim j As Integer
     
    ' remplissage du tableau
    MonTab(0) = "rrrr"
    MonTab(1) = "ssss"
    MonTab(2) = "eeee"
    MonTab(3) = "cccccccc"
    MonTab(4) = "llllc"
    MonTab(5) = "lllla"
     
    ' trier le tableau
    For i = 0 To UBound(MonTab) - 1
      For j = i + 1 To UBound(MonTab)
        If MonTab(i) > MonTab(j) Then
          x = MonTab(i)
          MonTab(i) = MonTab(j)
          MonTab(j) = x
        End If
      Next j
    Next i
    A toutes fins utiles

    A+

  20. #20
    Membre régulier Avatar de Mugette
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 194
    Points : 80
    Points
    80
    Par défaut
    Petite question :
    A partir de ce code, je ne peux pas trier les données que j'ai dans ma combobox par ordre croissant ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For j = 1 To Range("A65536").End(xlUp).Row
    ComboBox1 = Range("A" & j)
    If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Range("A" & j)
    Next j

Discussions similaires

  1. supprimer les doublons dans une table
    Par mavean dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 26/06/2019, 13h26
  2. 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
  3. supprimer les doublons dans une combobox
    Par pierrot67 dans le forum Débuter
    Réponses: 12
    Dernier message: 03/04/2010, 11h05
  4. Comment supprimer les doublons d'une table?!
    Par JauB dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/01/2006, 08h48

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