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 :

Suppression de doublon [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 2
    Par défaut Suppression de doublon
    Bonjour le forum,

    je n'ai pas trouvé une solution pour ce que je souhaite faire, j'ai donc besoin de vous.

    Ma situation :

    J'enregistre des valeurs dans trois colonnes ( A,B et C)
    Le nombre de ligne est variable et aucune case n'est vide (dans mon exemple j'ai fais une sélection manuelle et donc fixe A3:C25 mais je sais modifier la sélection)

    Je souhaite :
    1 - Trier les valeurs dans l'ordre alphabétique (colonne 1 prioritaire)
    2 - supprimer les doublons*
    3 - Copier-coller l'ensemble obtenu

    *Point spécifique :
    J'entends par doublon deux lignes (ou plus) dont les valeurs de la colonne A et B sont identique. Dans ce cas je souhaite conserver l'exemplaire dont la valeur en colonne C est la plus grande.

    En utilisant la fonction Filtre élaboré, j'ai donc obtenu ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub Test()
     
        Range("A3:C25").select
        Selection.Sort Key1:=Range("A3"), Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
        Range("A3:C25").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("F12"), Unique:=True
     
    End Sub
    Que dois je modifier pour y arriver (ou autre solution...) Merci

  2. #2
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Une macro qui vas supprimer les ligne en question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim i As Integer
     
    For i = Range("A65536").End(xlUp).Row To 2 Step -1
        If Cells(i, 1) = Cells(i - 1, 1) And Cells(i, 2) = Cells(i - 1, 2) Then
            If Cells(i, 3) > Cells(i - 1, 3) Then
                Rows(i - 1).Delete
            Else
                Rows(i).Delete
            End If
        End If
    Next i
    Je gère les doublets les triplet et autre, il faut juste bien classer la colonne A de sorte a ce que les doublon soit bien les uns à la suite des autres

    Une remarque pour la suite quand tu donnes un code utilise les balises codes

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Perso, je préfère :

    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
     
    Sub Test()
     
    Dim FL1 As Worksheet
    Dim Valeur As Variant, c As Range, Valeur2 As Variant, d As Range
    Dim NoLigne As Long, DerLig As Long, NoLigne2 As Long, DerLig2 As Long
     
        Set FL1 = Worksheets("BlaBla")
        NoLigne = 1
        Do
            If Not Cells(NoLigne, 1) = "" Then
                Valeur = Cells(NoLigne, 2)
                Valeur2 = Cells(NoLigne, 1)
                Do
                    With FL1.Range("B" & NoLigne + 1, [B65536].End(xlUp))
                        DerLig = 0
                        Set c = .Find(Valeur, LookIn:=xlValues, LookAt:=xlWhole)
                        If Not c Is Nothing Then
                            If c.Row > NoLigne Then
     
                                With FL1.Range("A" & NoLigne + 1, [A65536].End(xlUp))
                                Set d = .Find(Valeur2, LookIn:=xlValues, LookAt:=xlWhole)
                                If Not d Is Nothing Then
     
                                    DerLig = c.Row
                                    c.EntireRow.Delete
     
                                End If
                                End With
                            End If
                        End If
                        Set c = Nothing
                    End With
                Loop While DerLig > NoLigne
            End If
            NoLigne = NoLigne + 1
        Loop While NoLigne < FL1.Range("B65536").End(xlUp).Row
     
    End Sub
    Ici, j'ai supposé qu'on partait avec une ligne 1 non vide dès le début mais suffit de changer NoLigne si tu veux changer ça.

    Je préfère ça vu que tu n'as pas besoin de trier le tout avant de gérer la suppression des doublons. Cela supprime les doublons sans aucun tri préalable. Il y a donc un gain de temps considérable qui peut-être utile si tu as beaucoup de données. Après, si tu veux quand même un résultat trié, tu peux toujours le faire après...

    Je pense aussi qu'en passant par un .Find, il y a un gain de temps par rapport aux autres traitements : c'est à confirmer, je ne suis pas du tout sûr de moi à ce niveau là

    Dans le cas présent, je n'ai pas pris en compte la condition où il faut garder la valeur de la colonne C la plus grande mais tu peux arranger ça facilement ou même demander si tu n'y arrives pas

    Bonne chance !

    EDIT : pour le copier/coller, tu as des exemples partout sur le forum et sur le net (). Tape juste : copy/paste vba et c'est parti. De plus, c'est pas bien compliqué sachant que tu connais ta première ligne et ta dernière (DerLig ) une fois la première partie du code exécutée.

  4. #4
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Si de toutes facon les ligne sont trié qui est l'objectif. (remaque excel le fait très bien tout seul pas besoin de macro pour ca. )

    Ma méthode sera plus rapide qu'une fonction find qui va devoir tester toutes les ligne suivante de la colonne
    n-1 test pour le premier n-2 pour le suivante etc. soit (n/2)*(n-1) plus encore une série de test quand la cellule de la colonneB a un doublon pour tester la colonne A (plus dur a quantifier)

    alors que ma méthode réalise 2*(n-1) test
    Alors oui mes test sont plus lent mais beaucoup moins nombreux.

    Non mais je vais pas laisser critiquer mes codes comme ca

    Mais effectivement la méthode find et le meilleur moyen de chercher une valeur si on ne sait pas ou elle est situé

  5. #5
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 2
    Par défaut
    Merci à vous deux, vos solutions me permettent d'apprendre de nouvelles fonction.

    J'avais presque réussi à faire comme Krovax finalement mais avec RANGE ce qui me posait des difficultés.

    Je clos le sujet et j'ai pris note pour les balises codes

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

Discussions similaires

  1. Suppression de doublons et insertion
    Par Samish dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/08/2005, 21h57
  2. Réponses: 17
    Dernier message: 03/12/2004, 11h17
  3. [langage] Suppression de doublon dans tableau
    Par LFC dans le forum Langage
    Réponses: 5
    Dernier message: 15/04/2004, 14h08
  4. Requête de suppression de doublons : besoin d'aide
    Par biocorp dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2004, 17h04
  5. [LG]Suppression de doublons
    Par moustique31 dans le forum Langage
    Réponses: 5
    Dernier message: 20/12/2003, 21h03

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