Doublons supr

Signaler
Messages postés
11
Date d'inscription
mardi 2 octobre 2007
Statut
Membre
Dernière intervention
12 octobre 2007
-
Messages postés
206
Date d'inscription
lundi 22 novembre 1999
Statut
Membre
Dernière intervention
3 juillet 2008
-
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
       
Else
        j = j + 1
        k = k + 1
       
        End If
        Next
  
End Sub

9 réponses

Messages postés
206
Date d'inscription
lundi 22 novembre 1999
Statut
Membre
Dernière intervention
3 juillet 2008

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 :)

Gérôme GUILLEMIN
Auteur du langage FBSL
Messages postés
206
Date d'inscription
lundi 22 novembre 1999
Statut
Membre
Dernière intervention
3 juillet 2008

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

Gérôme GUILLEMIN
Auteur du langage FBSL
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
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.

ciao...
BruNews, MVP VC++
Messages postés
206
Date d'inscription
lundi 22 novembre 1999
Statut
Membre
Dernière intervention
3 juillet 2008

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.

Gérôme GUILLEMIN
Auteur du langage FBSL
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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.

ciao...
BruNews, MVP VC++
Messages postés
206
Date d'inscription
lundi 22 novembre 1999
Statut
Membre
Dernière intervention
3 juillet 2008

Je ne le fais que sur une seule colonne, en general ça suffit.

Gérôme GUILLEMIN
Auteur du langage FBSL
Messages postés
11
Date d'inscription
mardi 2 octobre 2007
Statut
Membre
Dernière intervention
12 octobre 2007

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
Messages postés
46
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
18 décembre 2007

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)

        Cells(i, 2) = Un.Item(i)

    Next i

End Sub

Bonne journée

 
Messages postés
206
Date d'inscription
lundi 22 novembre 1999
Statut
Membre
Dernière intervention
3 juillet 2008

Bonjour,

J'ai encore plus court !

Columns("A:A").Select
Range("A1:A32000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("B1"), Unique:=True

Gérôme GUILLEMIN
Auteur du langage FBSL