Supprimer des lignes excel en fonction d'une valeur

Fermé
balooooooooo Messages postés 5 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 18 avril 2014 - Modifié par balooooooooo le 16/04/2014 à 21:07
balooooooooo Messages postés 5 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 18 avril 2014 - 18 avril 2014 à 12:24
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
A voir également:

2 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
17 avril 2014 à 06:28
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
balooooooooo Messages postés 5 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 18 avril 2014
17 avril 2014 à 15:30
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
Modifié par michel_m le 17/04/2014 à 08:31
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
balooooooooo Messages postés 5 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 18 avril 2014
Modifié par balooooooooo le 17/04/2014 à 16:31
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
17 avril 2014 à 16:45
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
balooooooooo Messages postés 5 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 18 avril 2014
17 avril 2014 à 16:59
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
balooooooooo Messages postés 5 Date d'inscription mercredi 16 avril 2014 Statut Membre Dernière intervention 18 avril 2014
Modifié par balooooooooo le 18/04/2014 à 12:24
Bonjour Michel,

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

Baloooooo
0