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 :

Supprimer les doublons dans une collection VBA [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Kentarosan
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2017
    Messages : 37
    Par défaut Supprimer les doublons dans une collection VBA
    Bonjour,

    Après avoir cherché un moment sur le net et par moi-même, je viens vous demander de l'aide.

    Voilà :
    Après avoir effectué plusieurs recherches dans un même tableau mais avec des critères différents à chaque fois, j'ai une collection "d'identifiants" (un id unique donné à chaque ligne du tableau) qui respectent tous au moins un des critères de recherche. Cette partie est fonctionnelle.

    Maintenant, il faudrait que je puisse me débarrasser des doublons qui se trouvent dans ma collection. J'ai cherché à faire une fonction qui prendrait ma collection "polluée de doublons" et m'en renverrai une nettoyée. Mais je ne m'en sors pas...

    Jusqu'à présent, j'ai essayé avec deux boucles for imbriquées, la première parcourant la collection du début à la fin et la deuxième de l'index courant de la première jusqu'à la fin, en testant pour chaque couple d'identifiants s'ils sont identiques. Le problème c'est que si dès lors que je repère un doublon je le supprime, mes variables qui me servent à faire les boucles risquent de sauter des éléments ou pire, de sortir des limites...

    Il y a peut être une solution plus simple mais je ne l'ai pas trouvé...

    Merci par avance du temps que vous voudrez bien m'accorder !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    je pense qu'il y a méprise, car une {collection} ne peut avoir de doublon sauf si tu n’utilises pas la clé de c'est {collection}

    précises ta définition du mot {collection}

  3. #3
    Membre averti Avatar de Kentarosan
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2017
    Messages : 37
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    Bonjour,
    je pense qu'il y a méprise, car une {collection} ne peut avoir de doublon sauf si tu n’utilises pas la clé de c'est {collection}

    précises ta définition du mot {collection}
    On parle bien de la même chose sauf que je n'ai pas utilisé les clés, en effet... Je devrais en avoir honte? Mais je ne pense pas m'en servir (des clés) parce que juste après je ferais la même opération de recherche sauf que je ne garderai que ceux qui sont présents plusieurs fois dans la liste / collection. J'aurai donc cette fois-ci BESOIN des doublons.

    Merci à tous pour vos réponses, je n'avais en effet pas essayé de décrémenter ma boucle... Je vais essayer ça de suite !

    Riaolle : Mes données avec doublons sont contenues dans une collection / liste et sont le résultat de plusieurs extractions sur une même feuille du classeur mais selon des critères différents. Je ne peux pas modifier la feuille de classeur par conséquent et je ne pense pas qu'il soit nécessaire de recopier toute ma collection sur une nouvelle feuille pour effectuer le nettoyage et ensuite re-récupérer toutes les infos parce que j'en ai besoin ailleurs dans mon code. Ton algorithme me semble bien mais y a t il vraiment un intérêt à trier les données ? La simple recherche dans le tableau en désordre ne fonctionnerai pas ?
    EDIT : C'est bon je viens de comprendre ton algo, autant pour moi. J'étais toujours dans mon idée des deux boucles imbriquées..

  4. #4
    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,

    dans le cas des boucles de doublons, on fait souvent une boucle decrementee
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = MaCol.Count To 1 Step -1
    For j=i-1 to 1
    'test doublon et eventuelle suppression
    Next
    Next
    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

  5. #5
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Bonjour,
    Ton "tableau" est-ce une plage de cellules Excel? Dans ce cas utilise la fonctionnalité d'Excel permettant d'éliminer des doublons (Données > Supprimer les doublons) et l'enregistreur de macro, s'il faut en faire une macro.
    Sinon, une idée d'algorithme pour éliminer les doublons SI tu peux changer l'ordre de tes ID dans ta liste.
    1. Trier les ID (du plus grand au plus petit au l'inverse, ça n'a pas d'importance) --> tu trouveras beaucoup d'explication sur les methodes de tris efficaces sur internet !
    2. Faire une boucle décrémentée sur la liste triée, sauf le dernier élément
    3. Dans cette boucle, à chaque iteration, on comparera l'élément i de la liste avec l'élément i - 1
      • S'ils sont égaux, on élimine l'élément i
      • Sinon, on continue

    C'est une idée, il y a peut-être mieux

  6. #6
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonjour,

    dans le cas d'une plage, j'ai mis un exemple pour la suppression de doublons :
    Voir cette discussion à adapter à son cas bien sûr
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  7. #7
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub test()
    Set dico = CreateObject("Scripting.Dictionary")
    For i = 0 To 1
    If dico.Exists("Apples") Then MsgBox "Existe" Else dico.Add "Apples", "Apples"
    Next
    End Sub
    ainsi tu connais les valeur donc tu peux trouver les doublons!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    Private Sub test()
    Set dico = CreateObject("Scripting.Dictionary")
    With ActiveSheet.Range("A1")
        For i = 1 To .CurrentRegion.Rows.Count
              dico(.Offset(i, 0).Value) = dico(.Offset(i, 0).Value) & .Offset(i, 0).Address & ";"
        Next
    End With
    k = dico.keys
    For i = 0 To dico.Count - 1
        If UBound(Split(dico(k(i)), ";")) = 1 Then MsgBox dico(k(i))
    Next
    End Sub
    https://www.developpez.net/forums/d1...m/#post7484874

  8. #8
    Membre averti Avatar de Kentarosan
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2017
    Messages : 37
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub test()
    Set dico = CreateObject("Scripting.Dictionary")
    For i = 0 To 1
    If dico.Exists("Apples") Then MsgBox "Existe" Else dico.Add "Apples", "Apples"
    Next
    End Sub
    ainsi tu connais les valeur donc tu peux trouver les doublons!
    On ne parlait peut-être pas des mêmes collections dans ce cas Je n'ai encore jamais utilisé les dictionnaires mais je ne pense pas qu'ils soient adaptés dans ma situation..

    Merci à tous pour votre aide, j'ai ressorti mes cours d'algorithme et finalement j'ai opté pour une boucle while avec un booléen ^^

    Voilà le code pour ceux que ça intéresse, ça peut toujours être utile

    Il s'agit donc d'une méthode publique qui modifie directement la collection passée en paramètre. L'adaptation pour en faire une fonction ne doit pas être très compliquée

    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
    Public Sub SuppressionDoublons(collec As Collection)
        Dim fini As Boolean
        fini = False
     
        Do While Not fini
            fini = True
            For i = collec.Count To 1 Step -1
                For j = i - 1 To 1 Step -1
                    If collec(i) = collec(j) Then
                        collec.Remove j 'On supprime le doublon que l'on vient de trouver
                        fini = False    'On marque qu'une modification a été faite
                        Exit For        'On quitte la boucle pour aller la recommencer du début
                    End If
                Next
                If Not fini Then Exit For 'Si un doublon a été supprimé on recommence la recherche
            Next
        Loop
    End Sub

  9. #9
    Invité
    Invité(e)
    Par défaut
    les Scripting.Dictionary sont de collections mais plus facilement d'utilisation que l'objet collection de VBA, car elles te permettent de vérifié l'existence d'un item ce que ne te permet pas un collection!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If dico.Exists("Apples")Then

  10. #10
    Membre averti Avatar de Kentarosan
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2017
    Messages : 37
    Par défaut Merci à tous !
    Merci à tous pour vos conseils, problème résolu !

    Et merci pour l'info dysorthographie, j'irai voir tout ça plus en détail la prochaine fois que je songerai à utiliser une collection ou une liste.

  11. #11
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Re,
    En relisant le post 5, il serait peut-être plus simple et plus rapide d'utiliser un filtre élaboré dont on mettrait le résultat sur une feuille tremplin (comme cela on ne touche pas aux données sources) aussi bien pour enlever les doublons ou enlever ceux qui sont uniques.
    Après cela il suffit d'une ligne de code, si besoin, pour mettre ce résultat dans une variable tableau …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  12. #12
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Parfois il vaut mieux préférer la Collection interne au VBA au Dictionary, externe lui,
    à partir d'un certain volume de données, je viens encore d'en faire l'expérience !
    Et avec un contrôle d'erreur, il n'est pas difficile de contrôler l'existence d'une clef dans une Collection
    Du reste sur MAC il n'y a pas le choix, Dictionary étant spécifique à Windows.
    Et on peut même à partir d'une Collection créer une classe fonctionnant exactement comme Dictionary
    et ses fonctionnalités, en les améliorant même ou en y ajoutant de nouvelles …
    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Stockholm, London, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  13. #13
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Oui, j'en ai fait l'expérience il y a un bon moment sur un post que j'avais ouvert fort intéressant
    Merci Marc
    Voir ici pour ceux que ça intéresse :https://www.developpez.net/forums/d1...ns-specifique/
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

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

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. Supprimer les doublons dans une vue
    Par Le Marlou dans le forum SQL
    Réponses: 3
    Dernier message: 29/08/2008, 15h53
  3. Supprimer les doublons dans une table!
    Par Kirou dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/06/2008, 15h37
  4. [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