Suppression ligne dupliquées en fonction d'une valeur

Résolu
Bigmat75 Messages postés 12 Statut Membre -  
Bigmat75 Messages postés 12 Statut Membre -
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

1 réponse

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. Bigmat75 Messages postés 12 Statut Membre
       
      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
    2. Bigmat75 Messages postés 12 Statut Membre
       
      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
    3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      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
    4. Bigmat75 Messages postés 12 Statut Membre
       
      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
    5. Bigmat75 Messages postés 12 Statut Membre
       
      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