devilft7
Messages postés11Date d'inscriptionmardi 2 octobre 2007StatutMembreDernière intervention12 octobre 2007
-
11 oct. 2007 à 16:12
GEDDi
Messages postés206Date d'inscriptionlundi 22 novembre 1999StatutMembreDernière intervention 3 juillet 2008
-
16 oct. 2007 à 14:29
Bonjours à tous,
Après avoir essayé plusieur choses, et posé pas mal de questions à ce sujet sur ce forum, j'ai trouvé (enfin je pense, à vous de me dire si vous voyez des problemes) un moyen de supprimer des tableuax excel contenant des doublons vraiments rapidement, et le code est très simple.(environs 1min pour trier un tableau de 16000 lignes).
Voici le code, dites moi ce que vous en pensé:
Sub doublons()
Dim a As String, b As String, i, j, k
j = 3
k = 4
For i = 3 To 20000
a = Worksheets(1).Cells(j, 1)
b = Worksheets(1).Cells(k, 1)
If a = b Then
Worksheets(1).Rows(k).Delete
GEDDi
Messages postés206Date d'inscriptionlundi 22 novembre 1999StatutMembreDernière intervention 3 juillet 2008 11 oct. 2007 à 16:52
En effet, c'est super... lent ton truc ^^
J'ai réécrit un QSORT en VBA et je peux trier un tableau de 16 000 lignes en quelques millisecondes, apres en ajoutant une bete boucle qui écrate les doublons ça doit prendre qques secondes :)
GEDDi
Messages postés206Date d'inscriptionlundi 22 novembre 1999StatutMembreDernière intervention 3 juillet 2008 11 oct. 2007 à 16:55
Apres, l'algo à utiliser est simple :
1- Dans une variable de type String, récupérer la matrice Excel à traiter.
2- Faire un QSORT sur cette matrice
3- Faire une boucle sur la matrice QSORTée pour en éliminier les doublons
4- Transposer la variable épurée sur ta feuille Excel
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 oct. 2007 à 18:30
GEDDI > je serais curieux de voir cela, en tenant compte qu'il peut y avoir des cellules contenant des valeurs sur les lignes. Faudra aussi que tout cela tienne en mémoire, ce dont je doute fort sur de grosses matrices.
devilft7 >
a = Worksheets(1).Cells(j, 1)
b = Worksheets(1).Cells(k, 1)
etc, etc...
Ce sont ces répétitions de déréférencement d'objet qui sont très longues.
Bosse sur des objets Range:
Dim cel As Range
Set cel = ...
et c'en sera fini des Worksheets(1).Cells(...)
Je t'ai montré cela dans ta question précédente.
GEDDi
Messages postés206Date d'inscriptionlundi 22 novembre 1999StatutMembreDernière intervention 3 juillet 2008 11 oct. 2007 à 21:45
Brunews : j'ai l'ahbitude de bosser sur des matrices assez conséquentes avec Excel ( applications bureautiques de comptabilité à échelon national level mammouth++ ^^ ), et je peux te dire qu'une matrice de 32000 lignes avec mon type d'algo ne prend que qques secondes à etre digéré, bien sur cela exige un peu de RAM (environ la taille de la matrice multiplié par deux) mais ça gaze nickel en tout cas.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 oct. 2007 à 21:58
Qu'un qsort() soit performant, c'est certain.
Je me pose la question de savoir si la récup de toutes les cellules en matrice vaudra le coup par rapport à une simple navigation sur 1 seule colonne.
devilft7
Messages postés11Date d'inscriptionmardi 2 octobre 2007StatutMembreDernière intervention12 octobre 2007 12 oct. 2007 à 08:52
Je m'excuse mais au risque de paraitre ridiule je ne suis pas aussi calé que vous en programmation loin s'en faut, et meme si je voudrais bien faire fonctionner ce prog plus vite, je ne connait pas du tout cette QSORT dont vous parler, mais si vous avez 5min pour me montrer une aplication sur le probleme doublons par exemple, avec quelque ligne d'explicaton, je suis preneur.
Merci d'avance
arnaud95000
Messages postés46Date d'inscriptionvendredi 3 août 2007StatutMembreDernière intervention18 décembre 2007 12 oct. 2007 à 09:35
Bonjour,
Voici une petite macro bien pratique et rapide pour supprimer les doublons.
Sub FiltreDoublons()<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
Dim Cell As Range
Dim i As Integer
Dim Un As New Collection
On Error Resume Next
'Recherche les doublons dans la plage A1:A15
For Each Cell In Range("A1:A15")
Un.Add Cell, CStr(Cell)
Next Cell
On Error GoTo 0
For i = 1 To Un.Count
'Afiche le résultat sans doublon dans la colonne B si vous souhaitez mettre les résultats sur une ligne différentes il suffit de faire Cells(i+ nbre de lignes de différence,2)