Supprimer des lignes excel en fonction d'une valeur

balooooooooo Messages postés 5 Statut Membre -  
balooooooooo Messages postés 5 Statut Membre -
Bonjour à tous,
Je cherche une macro pour me débarrasser de lignes excel sous certaines conditions.
L'idée principale est de supprimer un certain nombre de lignes ayant des valeurs dupliquées dans la colonne A en fonction de la valeur d'une autre cellule (son maximum).
Pour être plus précis voici un exemple:
A B C D ... N
1 7
1 6
1 3
2 2
2 1
2 4
3 5
3 1
3 6
. .
. .
. .
300000 .

Je ne souhaite donc garder que les lignes en gras et supprimer les autres.
Je tiens à préciser que le fichier fait environ 300000 lignes.
La colonne A est celle qui contient les valeurs dupliquées, le tableau sera trié en fonction de cette colonne.
La colonne N contient un nombre allant de 1 à 40. Pour chaque valeur de la colonne A, le nombre contenu dans la colonne N ne sera jamais identique.

Merci d'avance pour toute aide potentielle

2 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,

    Ton tableau s'arr^te il à la colonne N ? sinon , à quelle colonne ?

    Dans la colonne A , le tri croissant est il déjà fait (pas bien compris le "sera") ?

    les nombres dans la colonne A sont ils incrémentés de 1 à chaque changement de valeur dupliquée ?

    le mieux serait de joindre un extrait de ton classeur avec 1000 ou 2000 lignes au maximum

    pour joindre une pièce
    mettre le classeur sans données confidentielles en pièce jointe sur
    http://cjoint.com/
    puis copier l'adresse du lien et la coller dans le message de réponse

    1
    1. balooooooooo Messages postés 5 Statut Membre
       
      Bonjour,

      Oui mon tableau s'arrête à la colonne N et le tri croissant est déjà fait sur la colonne A :-)
      En fait dans ma colonne A j'ai des valeurs dupliquées et je souhaiterai supprimer chaque ligne ou les valeurs de A sont dupliquées. Pour identifier quelle ligne garder et quelle ligne supprimer, j'ai des valeurs dans ma colonne N et je ne souhaite garder pour chaque valeur dupliquée de la colonne A que la ligne ou la valeur dans la colonne N est à son maximum.

      Voici le lien pour le fichier exemple comme demandé, je n'ai mis que quelques lignes en exemples car le principe est le même quel que soit le nombre de lignes:
      https://www.cjoint.com/?3DrpAGHbxOz

      Dans cet exemple je ne souhaite donc garder que les lignes 2, 6 et 10 car ce sont les lignes ou pour chaque valeur dupliquée de A nous avons la plus grande valeur dans la colonne N et je souhaite donc également supprimer les autres.

      En vous remerciant par avance.
      Cordialement.
      0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    En supposant que le tableau s'arr^te en colonne N et commence en ligne 2
    Merci de communiquer la durée pour 300 000 lignes
    proposition de code

    Option Explicit
    '----------------------------
    Sub epurer_svt_max()
    Dim Derlig As Long, T_in()
    Dim Dico As Object, Idx As Long, Maxi As Byte, Cle As Long, Nbre As Long
    Dim T_lignemaxi(), T_out(), Lig As Long, Cptr As Long, Col As Byte
    Dim Start As Single 'essai rapidité à supprimer apres essais

    '-----initialisations
    Start = Timer 'essai rapidité à supprimer apres essais
    Application.ScreenUpdating = False
    Derlig = Columns("A").Find("*", , , , , xlPrevious).Row
    T_in = Range("A2:N" & Derlig) 'n=14
    Set Dico = CreateObject("scripting.dictionary")

    '----création du couple valeur dupliquée / index de son max
    For Idx = 1 To UBound(T_in)
    If Not Dico.exists(T_in(Idx, 1)) Then
    Dico.Add T_in(Idx, 1), Idx
    'détermination valeur initiale maxi
    Maxi = T_in(Idx, 14)
    Cle = T_in(Idx, 1) 'mémorisation clé
    Else
    If T_in(Idx, 14) > Maxi Then
    'détermination nouvelle valeur maxi et ligne
    Dico.Item(Cle) = Idx
    Maxi = T_in(Idx, 14)
    End If
    End If
    Next
    'restitution de la selection des lignes avec maxi col_n
    T_lignemaxi = Dico.items

    '-----construction du tableau epuré
    Nbre = Dico.Count
    ReDim T_out(1 To Nbre, 1 To 14)
    Cptr = 1
    For Idx = 0 To Nbre - 1
    Lig = T_lignemaxi(Idx)
    For Col = 1 To 14
    T_out(Cptr, Col) = T_in(Lig, Col)
    Next
    Cptr = Cptr + 1
    Next

    ' ----restitution du tableau épuré
    Range("A2:N" & Derlig).Clear ' à valider après essais
    With Range("R2").Resize(Nbre, 14) ' R2 pour essai à remplacer par A2 au final
    .Value = T_out
    .Borders.Weight = xlThin
    End With
    '----essai rapidité à supprimer apres essais
    Application.ScreenUpdating = False
    MsgBox "tableau épuré en " & Timer - Start & " sec."
    End Sub

    Michel
    1
    1. balooooooooo Messages postés 5 Statut Membre
       
      Bonjour Michel,

      Merci pour ce code.
      J'ai testé sur le fichier que j'ai mis en exemple et j'ai eu une erreur de type mismatch qui apparait au niveau de cette ligne lorsque j'exécute:
      Cle = T_in(Idx, 1) 'mémorisation clé

      J'ai mis cette ligne en commentaire et j'ai re-exécuté, et la cela a fonctionné mais partiellement car les valeurs ont bien été effacées sauf une seule.

      J'ai essayé de voir d'ou provenait l'erreur mais je n'ai pas réussi à trouver.

      Merci d'avance pour votre aide.
      Bien cordialement.
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      quand je te demande:
      le mieux serait de joindre un extrait de ton classeur avec 1000 ou 2000 lignes au maximum
      tu me réponds
      je n'ai mis que quelques lignes en exemples car le principe est le même quel que soit le nombre de lignes:
      a ton avis, si je me permet de te demander 1000 ou 2000 lignes , ne crois tu pas qu'il y a une raison? sur les grands tableaux il vaut mieux voir la réalité (l'algorithme, mais oui mon cher, peut complètement changer) qu'un exemple bidon bricolé à la hâte

      décourageant....

      plus la la peine d'envoyer l'extrait demandé
      0
    3. balooooooooo Messages postés 5 Statut Membre
       
      Re-bonjour Michel,

      Vraiment désolé, je ne voulais pas vous braquer. Je n'ai pas vu cela sous ce point mais vous avez tout à fait raison.
      Je ne voulais pas vous "décourager".
      Je vous prie donc d'accepter mes excuses.
      Voici le fichier demandé si vous souhaitez encore m'aider.

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

      En vous remerciant par avance et en vous priant une nouvelle fois d'accepter mes excuses.
      Bien cordialement.
      0
    4. balooooooooo Messages postés 5 Statut Membre
       
      Bonjour Michel,

      Je vous prie de m'excuser mais svp aidez moi. Sans vous je n'y arriverai pas.

      Baloooooo
      0