Suppression ligne dupliquées en fonction d'une valeur

Résolu/Fermé
Bigmat75 Messages postés 12 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 16 mai 2014 - 25 avril 2014 à 15:25
Bigmat75 Messages postés 12 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 16 mai 2014 - 16 mai 2014 à 16:34
Bonjour,

J'ai un fichier excel d'environs 150000 lignes.
Ce fichier contient un certain nombre de lignes dont la valeur dans la colonne A est dupliquée.
J'ai une colonne N avec un certain nombre de valeurs pouvant aller de 1 à 7.

J'aimerai svp, si possible, pouvoir supprimer ces lignes dupliqués (en n'en gardant qu'une seule). Pour chaque dupliqué, la ligne que j'aimerai garder est celle dont la valeur de la colonne N est la plus élevée.

Existe t'il une macro pour faire cela svp?

N'hésitez pas à me demander plus d'infos ou des exemples si mon explication n'est pas claire :-)

En vous remerciant par avance pour votre aide.
CDT
A voir également:

1 réponse

eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
Modifié par eriiic le 26/04/2014 à 13:59
Bonjour,

à tester : https://www.cjoint.com/?DDAn6p9Wx31
Vu le nombre de lignes j'ai privilégié la vitesse de traitement.
Seulement si tu as des dates elles risquent d'être malmenées. Du style 03/04/2014 devient 04/03/2014.
Pas constaté sur mon fichier de travail mais contrôle quand même sur ton fichier. Si c'est le cas il faudra ajouter qcq chose pour les corriger.
Si plusieurs lignes ont la valeur max, seule la 1ère est retenue.
eric

En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
0
Bigmat75 Messages postés 12 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 16 mai 2014
28 avril 2014 à 09:46
Bonjour,

Merci beaucoup.
Je n'ai pas de dates dans le document donc aucun souci ;-)
De plus aucune ligne dupliquée n'aura la même valeur.

Je test et je reviens vers vous pour vous dire si cela fonctionne et surtout un grand merci.

PS: je n'oublierai pas de mettre le sujet en résolu ;-)

Bien cordialement.
0
Bigmat75 Messages postés 12 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 16 mai 2014
28 avril 2014 à 10:02
Re bonjour,

Je viens de tester, sur votre fichier cela fonctionne très bien.
Par contre quand je teste sur mes données, j'ai un message d'erreur: "mismatch" à cette ligne "ligMaxi = lig + Application.Match(maxi, Cells(lig, "N").Resize(nbLig), 0) - 1".

Je ne parviens pas à comprendre pourquoi.

Je mets le fichier que j'ai utilisé en pièce jointe de ce message, il contient 1500 lignes, si vous avez le temps d'y jeter un oeil.

https://www.cjoint.com/?3DCkcmbrIsL

Merci encore.

Bien cordialement.
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
28 avril 2014 à 11:10
Bonjour,

Je pensais que tu n'avais que des entiers en N.
De plus si ton séparateur décimal par défaut est le . il faut convertir.
Essaie avec ça :
Sub suppDoublons()
    Dim datas As Variant, lig As Long, nbLig As Long, derlig As Long
    Dim cle As String, maxi As Double, ligMaxi As Long
    Dim result() As Variant, ligResult As Long, col As Long
    
    If sepDec() <> "." Then
        Columns("N:N").Replace What:=",", Replacement:="."
    End If
    Range("A1").CurrentRegion.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes
    datas = Range("A1").CurrentRegion
    derlig = UBound(datas)
    ReDim result(1 To derlig, 1 To UBound(datas, 2))
    lig = 1: ligResult = 1: nbLig = 1: ligMaxi = 1
    Do
        If lig > 1 Then
            cle = datas(lig, 1)
            nbLig = Application.CountIf([A:A], cle)
            maxi = Application.Max(Cells(lig, "N").Resize(nbLig))
            ligMaxi = lig + Application.Match(maxi, Cells(lig, "N").Resize(nbLig), 0) - 1
            ligResult = ligResult + 1
        End If
        For col = 1 To UBound(datas, 2)
            result(ligResult, col) = datas(ligMaxi, col)
        Next col
        lig = lig + nbLig
    Loop Until lig > derlig
    Range("A1").CurrentRegion = result
End Sub

Private Function sepDec() As String
    'retourne le séparateur décimal utilisé
    If Application.UseSystemSeparators Then
        sepDec = Application.International(xlDecimalSeparator)
    Else
        sepDec = Application.DecimalSeparator
    End If
End Function

eric
0
Bigmat75 Messages postés 12 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 16 mai 2014
29 avril 2014 à 10:08
Bonjour Eric,

Encore merci pour ce code et toutes mes excuses car je ne t'avais pas précisé que la colonne N ne contenait pas que des entiers.
Je vais tester ce code et je te tiens au courant.

Encore un grand merci. Je n'oublierai pas de signaler le sujet comme résolu si cela fonctionne :)

Bien cordialement.
0
Bigmat75 Messages postés 12 Date d'inscription vendredi 25 avril 2014 Statut Membre Dernière intervention 16 mai 2014
29 avril 2014 à 16:43
Re-bonjour Eric,

J'ai l'impression que tout fonctionne parfaitement, encore merci.

Je vais re-tester juste pour être sûr et je cloture le topic dans un jour ou deux maximum si je n'ai pas eu de soucis.
Vraiment un grand merci pour toute ton aide :-D

Bien cordialement
0