aide doublons vba
#1
Débutant XLPages

Inscription: 23/09/2008

Messages: 2

Système d'exploitation:
PC
Version Excel utilisée:
2003,2007
Posté le : 26-09-2008 19h02
Bonjour à tous
J'aimerai écrire une macro excel qui me permette de repeter le code lorsque un doublon est identifié. Un membre m'a déja proposé une for,ule Excel, mais lorsqu'il y a un nombre important de sujet celui ci devient tres lent, je souhaite donc passer par une macro
exemple
Nom      Code
Jean      1
Pierre    2
Jonas    3
Jean      1
Jacques  4
Jean      1
Hors Ligne
Rapport   Haut 

Re: aide doublons vba
#2
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 26-09-2008 22h34
Bonsoir Irenée, le Forum,

Bienvenu à toi.

Après différentes tentatives, voici ce que je pense être la façon la plus rapide de traiter ta liste :

A mettre dans un module de code Standard :
Option Explicit

Sub Traitement()
'myDearFriend!  -  www.mdf-xlpages.com
Dim C As Collection
Dim P As Range, R As Range
Dim L As Long
    Application.ScreenUpdating = False
    Set C = New Collection
    With Sheets("Feuil1")       'A adapter
        L = .Cells(Application.Rows.Count, 2).End(xlUp).Row
        Set P = .Range(.Cells(1, 2), .Cells(L, 2))
    End With
    'Collecte de la liste d'éléments sans doublon
    On Error Resume Next
    For Each R In P
        If R.Text <> "" Then
            C.Add R.Text, R.Text
        End If
    Next R
    On Error GoTo 0
    P.Replace What:="", Replacement:="zzz", LookAt:=xlWhole 'Protection des éventuels éléments vides
    'Pour chaque élément, on affecte le code dans la colonne suivante
    For L = 1 To C.Count
        P.Replace What:=C(L), Replacement:="", LookAt:=xlWhole
        P.SpecialCells(xlCellTypeBlanks).Offset(0, 1).Value = L
        P.Replace What:="", Replacement:=C(L), LookAt:=xlWhole
    Next L
    P.Replace What:="zzz", Replacement:="", LookAt:=xlWhole 'Rétablissement des éléments vides
    Application.ScreenUpdating = True
End Sub
Pour info, j'ai pris ta liste d'origine et je l'ai tirée vers le bas, sur environ 1300 lignes.
Résultat : traitement quasi-immédiat en lançant cette procédure.

Cette façon de faire devrait normalement être beaucoup plus rapide que ce qui t'a été proposé sousCE LIEN (même si je n'ai pas pris le temps de tester la proposition de l'ami bhbh, qu'il me pardonne).

Je pense que tu es nouveau sur les forums de discussions Irenee, aussi je me dois de t'informer que le multiposts n'est généralement pas très bien vu des habitués (ou alors, il convient d'informer l'ensemble des intervenants, de part et d'autre, que tu as déjà fait la demande ailleurs en fournissant le lien correspondant).

Si la présente solution te convient (ou celle de notre site ami), je te remercie de bien vouloir SOLDER le présent fil de discussions comme il se doit.

Cordialement,


Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: aide doublons vba
#3
Débutant XLPages

Inscription: 23/09/2008

Messages: 2

Système d'exploitation:
PC
Version Excel utilisée:
2003,2007
Posté le : 26-09-2008 22h49
Bonsoir Didier
Une fois de plus merci pour ton aide
Je tiens à te rassurer qu'il n'était pas du tout dans mon intention de causer qulque préjudice, merci pour ton conseil
Hors Ligne
Rapport   Haut 

Re: aide doublons vba
#4
Débutant XLPages

Inscription: 19/04/2008

Messages: 16

Système d'exploitation:
PC
Version Excel utilisée:
2003, 2007
Posté le : 18-10-2008 19h32
Bonsoir Didier

Bonsoir, Irenée

Effectivement, ton code est plus rapide..

Sur 10 240 lignes :

Mon code : 1,625 seconde
le tien : 1,4375 seconde

Par contre, sur 40 960 lignes

Ton code : 10,6875 secondes
Le mien : 6,486375 secondes

testé avec Xl2003, P4 3.2 Ghz, Win xp

Amicalement

Bonne soirée
Hors Ligne
Rapport   Haut 

Re: aide doublons vba
#5
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 21-10-2008 23h22
Bonsoir Irenee, bhbh,

bhbh, je suis comme toi, j'aime bien comprendre... aussi j'ai pris le temps de refaire des tests et je t'avoue que je ne comprends pas bien comment tu as réalisé les tiens ou alors, je n'ai rien compris au sujet !

Pour que les choses soient claires, voici le détail de ce que j'ai fait (je t'invite à reproduire la même chose et, le cas échéant, je tiens à ta disposition le classeur qui m'a servi de support) :

CONDITIONS DU TEST :

J'ai donc reproduit un classeur sur 41 000 lignes. Pour ces tests, j'ai repris les données de départ soit sur la plage B1:B6 :
Jean
Pierre
Jonas
Jean
Jacques
Jean
J'ai ensuite sélectionné cette plage B1:B6 et l'ai tirée vers le bas jusqu'à la ligne 41 000.

J'ai ensuite ajouté un Timer à ma procédure qui ressemble donc à ça :
Sub Test_mDF()
'myDearFriend!  -  www.mdf-xlpages.com
Dim C As Collection
Dim P As Range, R As Range
Dim L As Long

Dim T As Double
    T = Timer
    Application.ScreenUpdating = False
   
    Set C = New Collection
    With Sheets("Feuil1")       'A adapter
        L = .Cells(Application.Rows.Count, 2).End(xlUp).Row
        Set P = .Range(.Cells(1, 2), .Cells(L, 2))
    End With
    'Collecte de la liste d'éléments sans doublon
    On Error Resume Next
    For Each R In P
        If R.Text <> "" Then
            C.Add R.Text, R.Text
        End If
    Next R
    On Error GoTo 0
    P.Replace What:="", Replacement:="zzz", LookAt:=xlWhole 'Protection des éventuels éléments vides
    'Pour chaque élément, on affecte le code dans la colonne suivante
    For L = 1 To C.Count
        P.Replace What:=C(L), Replacement:="", LookAt:=xlWhole
        P.SpecialCells(xlCellTypeBlanks).Offset(0, 1).Value = L
        P.Replace What:="", Replacement:=C(L), LookAt:=xlWhole
    Next L
    P.Replace What:="zzz", Replacement:="", LookAt:=xlWhole 'Rétablissement des éléments vides
   
    Application.ScreenUpdating = True
    MsgBox Timer - T
End Sub

J'ajoute ensuite ta procédure dans laquelle j'insère le même Timer ainsi que l'utilisation de la propriété ScreenUpdating (pour aider à la comparaison) :
Sub Test_bhbh()
Dim MesNums As Object, Cel As Range

Dim T As Double
    T = Timer
    Application.ScreenUpdating = False
   
    Set MesNums = CreateObject("Scripting.Dictionary")
    For Each Cel In Range("B2:B" & [B65000].End(xlUp).Row)
        If Not MesNums.Exists(Cel.Value) Then
            MesNums.Add Cel.Value, Cells(Cel.Row, 1).Value
        Else
            temp2 = MesNums.items
            temp1 = MesNums.keys
            For i = 0 To MesNums.Count
                If temp1(i) = Cel.Value Then Cells(Cel.Row, 1).Value = temp2(i): Exit For
            Next i
        End If
    Next Cel
   
    Application.ScreenUpdating = True
    MsgBox Timer - T
End Sub
Comme pour ma procédure, le Timer ajouté ne nuit en rien à la vitesse d'exécution, mais permet de la formaliser.


LE TEST

- Je lance ma procédure une première fois :
Résultat : 16,539085 --> soit un peu plus de 16 secondes (un peu plus long que chez toi)
- J'efface la colonne C et je relance ma procédure une deuxième fois:
Résultat : 16,546875
- J'efface à nouveau la colonne C et relance une troisième fois :
Résultat : 16,546875 (exactement le même résultat que la 2ème fois)

- Je lance ta procédure une première fois :
Résultat : .... 405,7265625 (soit un peu plus de 5 minutes !!!)
- Pensant que la propriété ScreenUpdating pourrait peut-être avoir ici un effet négatif (ça arrive !), je la neutralise en effaçant les 2 lignes correspondantes et je relance une  deuxième fois ta procédure :
Résultat : 472,1640625 (soit plus de 7 minutes !!!)

J'ai pourtant pris soin de réaliser les deux séries de test strictement dans les mêmes conditions !

Autre remarque importante : chez moi, ta procédure ne met pas à jour les codes 1, 2, 3, etc... comme souhaité dans le sujet. La colonne A ainsi que la colonne C restent vierges.


Pour info : tests réalisés sous XL2003 - Portable Centrino - 1,20 Ghz - Windows Vista.

Cordialement,



Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: aide doublons vba
#6
Débutant XLPages

Inscription: 19/04/2008

Messages: 16

Système d'exploitation:
PC
Version Excel utilisée:
2003, 2007
Posté le : 24-10-2008 19h35
Bonsoir, Didier

Loin de moi, cette envie de vouloir polémiquer

Mais tes résultats m'étonnent....

je joins un fichier, allégé, avec un code qui remplit les 40 000 lignes (pour ne pas alourdir le fichier)

Ensuite, un bouton, avec ton code, et un autre, avec le mien

J'ai laissé les résultats obtenus sur mon PC (PS, WinXp, et Vista, peut-être?)

J'ai aussi modifié le code, afin de répondre à ta remarque importante (bienvenue, c'était un oubli de ma part)

Bonne soirée

PS, si d'autres personnes pouvaient tester, je pense qu'on pourrait avancer...

Amicalement, et bon week-end
Pièce jointe:
zip irenee_mdf.zip   [ Taille: 12.35 Ko - Téléchargements: 646 ]
Hors Ligne
Rapport   Haut 

Re: aide doublons vba
#7
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 24-10-2008 20h59
Bonsoir Irenee, bhbh, le Forum,

Non bhbh, le mot "polémique" n'a pas sa place ici et si j'ai détaillé le déroulement de mon test c'est justement pour que tu puisses faire de même et revenir. Toi et moi, on fait partie de cette catégorie de gens qui aiment bien comprendre et c'est tout l'objectif de cet échange

Cela dit, grâce à ton exemple, je viens de "comprendre" pourquoi nous avons des résultats si différents (et XP ou Vista n'y sont pour rien).


En fait, nous ne partons pas de la même interprétation de l'énoncé :

- Toi, tu pars du principe que sur la série qu'indique l'ami Irenee est déjà déterminée et que chaque élément possède déjà son code en colonne A et donc qu'il n'y a que 7 éléments sans doublon que tu "tires" ensuite sur  40000 lignes.

- Moi, je pars du principe qu'on ne connait pas à l'avance le nombre d'éléments sans doublon possible dans une liste variable qui peut aller jusqu'à 40000 lignes (peut-être toutes différentes !). Ce qui sous-entend déjà qu'il n'y a rien en colonne A au départ du traitement (juste une liste variable de noms en colonne B) et que la macro est chargée d'affecter un numéro (code) à chaque élément distinct rencontré et ce même numéro pour chaque doublon.

Si je lance l'exemple tel que tu l'as interprété (avec les codes en colonne A) alors oui, il n'y a pas photo et la procédure que je propose ne sert visiblement à rien car elle n'a pas le même objectif.

Si, par contre, j'efface les "codes exemples" inscrits en colonne A (c'est comme ça que je les vois moi), alors nous avons là un résultat fort différent...

Cordialement,

EDITION :
Et si tu passes par là en soirée, je serai ravi d'en discuter avec toi sur notre XLchat si tu le veux bien


Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: aide doublons vba
#8
Débutant XLPages

Inscription: 19/04/2008

Messages: 16

Système d'exploitation:
PC
Version Excel utilisée:
2003, 2007
Posté le : 24-10-2008 21h35
Re-,

Didier, code légèrement modifié

pour initialiser les comptes

Sub hubert()
t = Timer
Application.ScreenUpdating = False
Dim MesNums As Object, Cel As Range, Cde As Integer
Set MesNums = CreateObject("Scripting.Dictionary")
Cde = 1
For Each Cel In Range("B1:B" & [B65000].End(xlUp).Row)
    If Not MesNums.Exists(Cel.Value) Then
        MesNums.Add Cel.Value, Cde
        Cel.Offset(0, 1).Value = Cde
        Cde = Cde + 1
    Else
        temp2 = MesNums.items
        temp1 = MesNums.keys
        For i = 0 To MesNums.Count
            If temp1(i) = Cel.Value Then Cells(Cel.Row, 1).Value = temp2(i): Exit For
        Next i
    End If
Next Cel
[G2] = Timer - t
End Sub
Hors Ligne
Rapport   Haut 

Re: aide doublons vba
#9
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 26-10-2008 00h09
Bonsoir Irenee, bhbh, le Forum,

Bravo bhbh ! Impeccable.

Il n'y a pas photo, ta procédure est maintenant 2 à 3 fois plus rapide que celle que je proposais. Félicitations, je suis épaté

Du coup, tu me réconcilies avec le Dictionary.

Cordialement,

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 


Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Qui consulte actuellement ce sujet ?   1 Utilisateur(s) anonymes