IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Identifier les doublons dans une base


Sujet :

Macros et VBA Excel

  1. #161
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    qu'est ce que tu raconte le tri en G dont je parle c'est la remise en ordre par la colonne des rows on s'en fout que tu tri en F ou en H
    puisque mon résultat est bon avant la remise en ordre par G!!!!!!!

    la colonne H c'est sensé être la copie de F sans les doublons remplacés par du vide

    c'est du n'importe quoi que tu me dis

    si j'ai avant la remise en ordre
    toto 5 toto
    titi 2
    titi 11

    je devrais donc avoir après la remise en ordre par la colonne du milieu en l'occurrence la G!!!!
    titi 2
    toto 5 toto
    titi 11

    c'est pas compliqué et c'est pas le cas c'est cette ligne qui va pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     .Range("f1:h" & n).Sort key1:=.Range("g1"), order1:=xlAscending, Header:=xlNo
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter
      0  1

  2. #162
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Jacques,

    pourtant ce que tu as conçu sur 200 000 est extrêmement rapide et rien qu'avec du excel,
    tu viens de démontrer explicitement ce que Marc ne cesse de répéter : Penser Excel avant VBA", et là c'est flagrant

    je te félicite de nouveau pour cette formidable démonstration

    A Ryu : je disais plus haut que je ne pouvais pas aller plus vite.
    Cette affaire de "fantôme" me fait remettre en cause ce sentiment.
    Il n'est pas impossible (mais n'en sais encore rien) que je puisse trouver le moyen d'aller encore plus vite …
    Alors si tu as un lapin dans ton chapeau pour aller plus vite, je vais devenir extrêmement curieux

    OK
    modification de cette ligne 25 comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        .Range("F1:H" & n).Sort key1:=.Range("G1"), order1:=xlAscending, Header:=xlNo '-->> nous remettons les choses dans l'ordre originel, toujours sans toucher à l'ordre
    mais pour supprimer les doublons mieux vaut le faire comme je l'ai fait avec H


    Mais quoi qu'il en soit si tu veux traiter tes doublons tu devras passer par la colonne H qui est la colonne maitre pour les doublons, sans elle t'a rien, car elle te permet de faire énormément de choses

    ça n'enlève rien au principe du code de unparia qui est top

    Edit : car ici, ce qui est mis en avant c'est le mécanisme et pas autre chose
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie
      0  1

  3. #163
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    je n'enleve rien au code de unparia puisque je te dis que le résultat est bon avant remise en ordre donc son moteur base est bon

    et j'ai très bien compris que c'est la H qui me permettra de gérer les doublons je ne suis pas complètement ........

    j'ai donc changé les minuscule pour majuscule dans les address de range
    et c'est pareil

    pour que tu comprenne que je te dis pas de sottises voila la démo sans remise en ordre qui montre bien mes doublons et la demo avec remise en ordre qui fou le boxon

    sans la remise en ordre

    Nom : sans ordre.JPG
Affichages : 355
Taille : 388,3 Ko



    et maintenant avec la ligne pour l'ordre

    Nom : avec ordre.JPG
Affichages : 358
Taille : 380,2 Ko

    tu vois que je ne dis pas de sottises
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter
      0  1

  4. #164
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    tu pourrais rajouter cette ligne dans ton code de démo stp - je ne la vois pas sur tes captures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        .Range("H2:H" & n).Value = .Range("H2:H" & n).Value '--->> et là aussi, nous figeons les valeurs, pour toujours les mêmes raisons
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie
      1  1

  5. #165
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    a ben voila maintenant ca marche même si je tri par f

    un peu plus de 3 seconde pour 65536 lignes c'est un bon score

    Nom : Capture.JPG
Affichages : 369
Taille : 355,5 Ko
    bien vu ryu
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter
      0  1

  6. #166
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    ha enfin tout fini par rentré dans l'ordre

    sur 200 000 lignes à traiter c'est en effet un très bons score
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie
      0  1

  7. #167
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Patrick, j'ai constaté le même problème que toi ! Et pendant que je repartais de ma version
    tu as bien cerné le problème du tri sur F:G au lieu de F:H     comme Ryu dans le post #162 () …

    Comme je teste avec une version 2003, je suis limité à 65 536 lignes et voici donc mon code d'initialisation
    (dans celui de Franck du post #126 il faut inverser les ScreenUpdating !) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Initialisation()
            Const N = 65535
            Dim C&, R&, S$(N, 4)
            Randomize 666.666
            ActiveSheet.UsedRange.Clear
            [I1].Select
        For R = 0 To N
            For C = 0 To 4:  S(R, C) = Chr$((5 * Rnd) + 65):  Next
        Next
            Application.ScreenUpdating = False
            [A1].Resize(N + 1, 5).Value = S
            Application.ScreenUpdating = True
    End Sub

    Voici le code d'Unparia (déclenchant une erreur s'il n'y a pas de doublon) à ma sauce
    s'exécutant de mon côté en 2,667s pour les 65 536 lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Sub TriDoublonsUnparia()
              Dim T!, pl_doublons As Range
                  T = Timer
                  Application.ScreenUpdating = False
        With ActiveSheet.UsedRange.Resize(, 8).Columns
                 .Item(6).Formula = "=A1&""¤""&B1&""¤""&C1&""¤""&D1&""¤""&E1"
                 .Item(7).Formula = "=ROW()"
            With .Item("F:G")
                 .Formula = .Value
                 .Sort .Cells(1), xlAscending, Header:=xlNo
            End With
                 .Cells(8).Value = 0
            With .Item(8).Rows("2:" & .Rows.Count)
                 .Formula = "=IF(F2=F1,"""",F2)"
                 .Formula = .Value
            End With
                 .Item("F:H").Sort .Cells(7), xlAscending, Header:=xlNo
                  Set pl_doublons = .Item(8).SpecialCells(xlCellTypeBlanks)
                  Application.ScreenUpdating = True
                  MsgBox Format(Timer - T, "0.000s") & " pour traiter " & .Rows.Count & " lignes de 5 colonnes" & _
                         vbLf & vbLf & "et extraire la plage " & pl_doublons.Address(0, 0)
                 .Item("F:H").Clear
        End With
                pl_doublons.EntireRow.Select
            Set pl_doublons = Nothing
    End Sub
    Mettre la ligne de code n°22 en commentaire pour contrôler …
    J'ai modifié le séparateur dans la formule (ligne n°6) afin de pouvoir effectuer un contrôle via la recherche d'Excel.


    Et je gagne une bonne seconde comme je l'ai déjà posté plusieurs fois notamment lors de l'accompagnement initiatique de Ryu
    en plaçant les doublons à la fin en vue de les supprimer par exemple, ici tout en conservant
    l'ordre des uniques (ligne n°17), sans erreur s'il n'y a pas de doublon,
    le traitement est réduit à 1,436s :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Sub TriDoublons()
              Dim T!, pl_doublons As Range, S$
                  T = Timer
                  Application.ScreenUpdating = False
        With ActiveSheet.UsedRange.Resize(, 8).Columns
                 .Item(6).Formula = "=A1&""¤""&B1&""¤""&C1&""¤""&D1&""¤""&E1"
                 .Item(7).Formula = "=ROW()"
            With .Item("F:G")
                 .Formula = .Value
                 .Sort .Cells(1), xlAscending, Header:=xlNo
            End With
                 .Cells(8).Value = 0
            With .Item(8).Rows("2:" & .Rows.Count)
                 .Formula = "=IF(F2=F1,1,0)"
                 .Formula = .Value
            End With
                 .Item("F:H").Sort .Cells(7), xlAscending
                 .Sort .Cells(8), xlAscending
                  S = " pour traiter " & .Rows.Count & " lignes de 5 colonnes"
                  Set pl_doublons = .Item(8).Find(1)
               If Not pl_doublons Is Nothing Then
                  Set pl_doublons = .Rows(pl_doublons.Row & ":" & .Rows.Count).Resize(, 5)
                  S = S & vbLf & vbLf & "et extraire la plage " & pl_doublons.Address(0, 0)
               End If
                  Application.ScreenUpdating = True
                  MsgBox Format(Timer - T, "0.000s") & S
                 .Item("F:H").Clear
        End With
            If Not pl_doublons Is Nothing Then pl_doublons.Clear: Set pl_doublons = Nothing
    End Sub


    Temps équivalent sans se préoccuper de l'ordre initial mais avec la suppression directe des doublons comprise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Sub SuppressionDoublons()
              Dim T!, Rg As Range, S$
                  T = Timer
                  Application.ScreenUpdating = False
        With ActiveSheet.UsedRange.Resize(, 8).Columns
                 .Item(6).Formula = "=A1&""¤""&B1&""¤""&C1&""¤""&D1&""¤""&E1"
                 .Item(7).Formula = "=ROW()"
                 .Item("F:G").Formula = .Item("F:G").Value
                 .Sort .Cells(6), xlAscending, Header:=xlNo
                 .Cells(8).Value = 0
            With .Item(8).Rows("2:" & .Rows.Count)
                 .Formula = "=IF(F2=F1,1,0)"
                 .Formula = .Value
            End With
                 .Item("F:H").Sort .Cells(7), xlAscending
                 .Sort .Cells(8), xlAscending
                  S = " pour traiter " & .Rows.Count & " lignes de 5 colonnes"
                  Set Rg = .Item(8).Find(1)
               If Not Rg Is Nothing Then
                .Rows(Rg.Row & ":" & .Rows.Count).Clear
                  Set Rg = Nothing
                  S = S & vbLf & vbLf & "et supprimer les doublons."
               End If
                 .Item("F:H").Clear
                  Application.ScreenUpdating = True
                  MsgBox Format(Timer - T, "0.000s") & S
        End With
    End Sub
    _________________________________________________________________________________________________________
    L’important, le principal, est de savoir ce qu’il faut observer. (Edgar Allan Poe)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)
      1  1

  8. #168
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Coucou Marc,

    Ca rappelle des souvenirs surtout dans ta façon de coder
    je t'ai mis

    Les résultats sur Mac (200 000) :

    - TriDoublonsUnparia

    Nom : TriDoublonsUnparia.png
Affichages : 328
Taille : 31,6 Ko


    - TriDoublons

    Nom : TriDoublons.png
Affichages : 269
Taille : 15,7 Ko


    - SuppressionDoublons

    Nom : SuppressionDoublons.png
Affichages : 203
Taille : 14,2 Ko
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie
      0  1

  9. #169
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Merci Ryu !

    Je viens d'optimiser la procédure TriDoublons et si tu obtiens les mêmes temps
    alors peut-être de mon côté sur Windows les temps ont été avantagés par son cache.

    Je viens de réessayer, j'ai toujours une seconde d'écart !

    A moins que cela provienne du nombre de lignes à traiter; j'essaierai sur un autre PC pour monter à 200 000 …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)
      0  1

  10. #170
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour à tous
    J'ai en effet bel et bien (étourderie) fait une erreur de colonnes dans le dernier tri de mon code.
    Merci de l'avoir redressée.

    J'ai voulu de bon matin tenter autre chose et en suis pour l'instant là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Private Sub CommandButton8_Click()
      Dim deb As Double, i As Long, c As String, pl_doubons As Range, t
      deb = Timer
      Application.ScreenUpdating = False
      ActiveSheet.UsedRange
      n = Cells.SpecialCells(xlCellTypeLastCell).Row
      ReDim t1(1 To n, 1 To 2)
      c = Chr(1)
      t = Range("A1:E" & n)
      For i = 1 To n
        t1(i, 1) = t(i, 1) & c & t(i, 2) & c & t(i, 3) & c & t(i, 4) & c & t(i, 5)
        t1(i, 2) = i
      Next
      With Range("F1:G" & n)
        .Value = t1
        .Sort key1:=Range("F1:G" & n), order1:=xlAscending, Header:=xlNo
        t = Range("F1:G" & n)
        For i = n To 2 Step -1
          If t(i, 1) = t(i - 1, 1) Then t(i, 1) = ""
        Next
        .Value = t
        .Sort key1:=Range("G1:G" & n), order1:=xlAscending, Header:=xlNo
         Set pl_doublons = .SpecialCells(xlCellTypeBlanks)
        .ClearContents
      End With
      Application.ScreenUpdating = True
      MsgBox Timer - deb & "  secondes pour traiter " & n & " lignes de 5 colonnes et extraire la plage " & pl_doublons.Address
      MsgBox "tiens ... on va (par exemple) la sélectionner"
      pl_doublons.EntireRow.Select
    End Sub
    ce traitement :

    - est d'une vitesse quasi égale à celle du traitement précédent
    - élimine les doublons les plus "récents" (les doublons dénoncés sont donc de plus en plus nombreux au fur et à mesure que l'on va vers la fin de la plage
    - n'a maintenant besoin que de deux colonnes "tremplin" (F et G) et plus trois. Je ne les utilise dans ce 1er jus que pour pouvoir profiter du tri de Excel

    Si l'on voulait se débarrasser maintenant totalement du tremplin des deux colonnes, il faudrait concevoir un tri sur matrice à deux dimensions aussi performant que le tri de Excel. Ce qui n'est pas acquis.
    Qui se lance avec moi dans cette tentative ? Ne levez pas le doigt tous à la fois, hein ...
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
      0  1

  11. #171
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour à tous,
    Salut Jacques,

    J'essaie de rattraper le retard...
    Je n'interviens rapidement que sur ton idée d'un tri de variable tableau à 2 dimensions (je reviendrais tout à l'heure).

    Ce tri ne saurait être aussi rapide que le tri Excel.
    Le tri le plus rapide connu à ce jour est la méthode de "Quick Sort".
    Son code s'apparente à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Public Sub Tri_2_Dim(ByRef Tableau As Variant, _
                                   mini As Long, _
                                   Maxi As Long, _
                                   Optional Colonne As Long = 0)
     
        Dim i As Long, j As Long, Pivot As Variant, TableauTemp As Variant, ColTemp As Long
     
            On Error Resume Next
            i = mini: j = Maxi
            Pivot = Tableau((mini + Maxi) \ 2, Colonne)
            While i <= j
                While Tableau(i, Colonne) < Pivot And i < Maxi: i = i + 1: Wend
                While Pivot < Tableau(j, Colonne) And j > mini: j = j - 1: Wend
                If i <= j Then
                    ReDim TableauTemp(LBound(Tableau, 2) To UBound(Tableau, 2))
                    For ColTemp = LBound(Tableau, 2) To UBound(Tableau, 2)
                        TableauTemp(ColTemp) = Tableau(i, ColTemp)
                        Tableau(i, ColTemp) = Tableau(j, ColTemp)
                        Tableau(j, ColTemp) = TableauTemp(ColTemp)
                    Next ColTemp
                    'Erase TableauTemp
                    i = i + 1: j = j - 1
                End If
            Wend
            If (mini < j) Then Call Tri_2_Dim(Tableau, mini, j, Colonne)
            If (i < Maxi) Then Call Tri_2_Dim(Tableau, i, Maxi, Colonne)
    End Sub
    Mais...
    1- Le temps de traitement est de toutes manières supérieur à l'usage d'une collection parce que tu dois trier 2 fois!.
    2- Il te faudra bien un tremplin, dans ta feuille, pour pouvoir retourner l'adresse d'un Range de résultat à partir de ton tableau
    (à moins d'alimenter un String au fur et à mesure avec tout ce que cela entends de torture de méninges ET de longueur d'exécution induite)

    EDIT : Attention dans ton code aux variables : pl_doubons au lieu de pl_doublons et n non déclarée.

    @Marc-L : Bonjour et bonne année
    En effet, j'ai inversé mes Application.ScreenUpdating. Erreur de copié-collé à la mauvaise place.
    Je m'en vais de ce pas rectifier.

    Une curiosité...
    Serait-il possible que la propriété Rows.Count d'un Range ne retourne que le compte des lignes de sa première Area?

    J'ai testé, et avec ma fonction, le RngResult.Rows.Count (ou pl_doublons.Rows.Count) me donne 50
    pour une Address du même Range commençant par : $J$1:$J$50,$J$52:$J$81,$J$83:$J$101, ....

    Si tel est le cas :
    - on ne peut pas se fier aux propriétés du Range ainsi obtenu.
    - en va t'il de même pour d'autres propriétés?
    Par contre, si tel n'est pas le cas, ça veut simplement dire que ma fonction n'est pas aboutie.

    L'un d'entre vous pourrait-il tester chez lui?
    Merci.

    EDIT : A priori Rows.Count ne retourne que le compte de la première Area.
    La preuve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
    Dim Rng As Range
        Set Rng = Range("$J$1:$J$50,$J$52:$J$81,$J$83:$J$101")
        MsgBox Rng.Rows.Count ' = 50
    End Sub
    Comment connaitre alors le nombre de lignes d'un Range de cellules discontinues ?
    Boucler sur tous les areas d'un range ?
    Autre méthode ou propriété existante ?

    Au fait, le nombre d'areas d'un Range est-il limité dans Excel ?
    Si oui, nous ne sommes pas bien avec cette fonction d'adressage de doublons...
    Cordialement,
    Franck
      0  1

  12. #172
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour,
    Citation Envoyé par Marc-L Voir le message
    Merci Ryu !
    Je viens d'optimiser la procédure TriDoublons et si tu obtiens les mêmes temps
    alors peut-être de mon côté sur Windows les temps ont été avantagés par son cache.

    Je viens de réessayer, j'ai toujours une seconde d'écart !

    A moins que cela provienne du nombre de lignes à traiter; j'essaierai sur un autre PC pour monter à 200 000 …
    Passe moi la nouvelle version je testerai. Mais bon il y a plusieurs facteurs jouant sur le test entre PC et Mac
    (Programmation du logiciel Excel ≠ entre les 2 plateformes, le système, la gestion de la mémoire… sans compter que l'optimisation doit être en faveur du PC)


    Citation Envoyé par unparia Voir le message
    Bonjour à tous
    J'ai en effet bel et bien (étourderie) fait une erreur de colonnes dans le dernier tri de mon code.
    Merci de l'avoir redressée.
    En Effet Jacques, ce n'est qu'une erreur d'étourderie, et la base principal est bien là; en faisant le pas à pas on vois bien que le résultat est ok, il suffisait de 2 tests pour trouver la petite faute (le dernier tri) de rien du tout
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie
      0  1

  13. #173
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    A Franck

    Rows.count ne peut retourner que le nombre de lignes du 1er objet area dont est composée la plage
    Si tu veux compter la totalité, til te faut nécessairement passer par une double boucle du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nb = 0
    for each a in la-plage areas
      for each r in a.rows
       nb = nb + 1
      next
    next
    Ceci dit, les objets cells échappent à cette règle et
    la-plage.cells.count te retournera le nombre de cellules total. Or, ta plage étant consituée de cellules sur une seule colonne -->> c'est également dans ce cas le nb de
    lignes

    Tu viens de me faire pour le coup penser que j'ai découvert récemment que VBA traitait probablement en catimini un type numérique dont il ne fait pas état. Tu te demandes quel est le rapport ? Je m'en suis aperçu de manière fortuite :
    -une recherche dans l'aide sur ce "type" m'a curieusement conduit à une rubrique VBA (que je tais pour l'instant). Ce qui montre que le nom de ce type a bien été associé à une clef. Or, ce nom n'apparaît NULLE PART dans le texte affiché ! (il faut bien qu'il soit quelque part, pourtant, hein ...). Bizarre ...

    J'en parlerai à la fin d'investigations qui s'annoncent longues.
    Amitiés
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
      0  1

  14. #174
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour Marc
    Non ! Car la répartition et le nombre des doublons n'ont eux (tu pourras le constater) aucune espèce d'incidence sur la vitesse d'exécution. Le seul facteur d'importance (et immuable) restera le nombre de lignes de la plage de base et le nombre des colonnes servant à la concaténation.
    Avec les mêmes données : la durée restera fixe indépendamment du nombre des doublons et de leur dissémination.
    C'est même l'une des raisons qui ont fait (voir plus haut) que je me suis arrangé pour que des tests puissent être faits en modifiant le nombre qui détermine la fréquence possible de doublons. On pourra constater que ces différences de fréquences n'ont aucun impact, elles, sur la vitesse d'exécution.
    Mais on aura l'occasion d'en reparler après tests.
    Et bien parlons-en.
    J'ai réalisé ce test.
    Soit x dans : L(i, k) = Chr(Int((x * Rnd) + 65))
    Vérification Numbre One : For x = 1 To 26
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    4,570313 secondes pour x = 1
    6,117188 secondes pour x = 2
    6,285156 secondes pour x = 3
    6,441406 secondes pour x = 4
    6,910156 secondes pour x = 5
    10,02734 secondes pour x = 6
    159,4453 secondes pour x = 7 '=====> Oula ! Mon processeur est parti prendre un café chez le voisin...
    16,73828 secondes pour x = 8
    12,32422 secondes pour x = 9
    12,98047 secondes pour x = 10
    10,875 secondes pour x = 11
    10,94922 secondes pour x = 12
    10,95313 secondes pour x = 13
    10,89063 secondes pour x = 14
    11,16797 secondes pour x = 15
    11,19922 secondes pour x = 16
    10,26563 secondes pour x = 17
    10,59375 secondes pour x = 18
    10,15625 secondes pour x = 19
    10,01563 secondes pour x = 20
    10,30859 secondes pour x = 21
    10,125 secondes pour x = 22
    9,359375 secondes pour x = 23
    9,546875 secondes pour x = 24
    9,78125 secondes pour x = 25
    10 secondes pour x = 26
    Vérification Numbre Two : (juste pour écarter la thèse de "saturation") : For x = 26 To 1 Step -1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    10,14063 secondes pour x = 26
    10,3125 secondes pour x = 25
    10,46875 secondes pour x = 24
    10,54688 secondes pour x = 23
    11,23047 secondes pour x = 22
    10,57813 secondes pour x = 21
    10,5 secondes pour x = 20
    10,70313 secondes pour x = 19
    11,07422 secondes pour x = 18
    11,05859 secondes pour x = 17
    11,03125 secondes pour x = 16
    10,04688 secondes pour x = 15
    10,15625 secondes pour x = 14
    9,859375 secondes pour x = 13
    9,875 secondes pour x = 12
    10,17188 secondes pour x = 11
    10,14063 secondes pour x = 10
    10,88672 secondes pour x = 9
    15,07031 secondes pour x = 8
    112,4922 secondes pour x = 7 '==> Ah non! C'est juste qu'il déteste la valeur 7 et n'a pas envie de travailler
    11,33984 secondes pour x = 6
    6,957031 secondes pour x = 5
    6,445313 secondes pour x = 4
    6,273438 secondes pour x = 3
    6,097656 secondes pour x = 2
    4,601563 secondes pour x = 1
    Que peut-on en déduire si ce n'est que mon processeur n'aime pas le chiffre 7 et qu'il le "maltraite"??

    Je dirais qu'il existe toutefois, malgré l'apparente similmitude, trois palliers :
    1- 4,5 secondes pour x = 1
    2- 6,5 secondes pour x compris entre 2 et 5 (inclus)
    3- 10 secondes pour x supérieur strictement à 5
    (et 7 bien sur qui buggue chez moi !!!)

    EDIT :
    Y aurait-il un souci avec : L(i, k) = Chr(Int((7 * Rnd) + 65))?
    Je viens de refaire les tests suivants successivements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    186,457 secondes pour x = 7
    1 aera, 200000 lignes
    111,4336 secondes pour x = 7
    1 aera, 200000 lignes
    14,77344 secondes pour x = 8
    1 aera, 200000 lignes
    EDIT 2 :
    Merci Jacques et Joe pour les Aeras.
    Cordialement,
    Franck
      0  1

  15. #175
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par pijaku Voir le message
    Comment connaitre alors le nombre de lignes d'un Range de cellules discontinues ?
    Boucler sur tous les areas d'un range ?
    Autre méthode ou propriété existante ?

    Bonjour,

    sur une plage discontinue, ou autrement formulé "sur une plage dont le nombre de Area est > 1", c'est bien le premier Area qui est utilisé quand on interroge le Rows.Count.
    en fait, ces deux lignes de codes sont équivalentes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Rng.Areas.Item(1).Rows.Count
    Rng.Rows.Count
    il n'y a, à ma connaissance, aucune autre solution que de boucler sur chaque Area de la collection Rng.Areas, en additionnant au fur et à mesure les Rows.Count

    Ps : on le fait tous par commodité, mais il faut rappeler (si des débutants nous lisent) que Area n'est pas un objet VBA, chaque item de Areas est un objet Range



    EDIT : unparia, on s'est croisé

    pourquoi une double boucle ?
    ça ne fait pas correctement le travail ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
    Dim Rng As Range
        Set Rng = Range("$J$1:$J$50,$J$52:$J$81,$J$83:$J$101")
        For Each c In Rng.Areas
            cpt = cpt + c.Rows.Count
        Next c
        MsgBox cpt
    End Sub
      0  1

  16. #176
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Messieurs, (allo Youz tonne) on a un problème.

    J'ai redémarré mon pc, n'ai ouvert qu'Excel et le gestionnaire des tâches Windows (pour zieuter l'utilisation UC), et voici les résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    16,62891 secondes pour x = 8 'UC aux environs de 50% tout le temps d'exécution
    1 aera 200000 lignes
    196,125 secondes pour x = 7 'UC aux environs de 50% tout le temps d'exécution
    1 aera 200000 lignes
    13,71484 secondes pour x = 8 'UC aux environs de 50% tout le temps d'exécution
    1 aera 200000 lignes
    J'ai lancé ces trois tests successivement, juste le temps de changer la valeur de x...

    Quelqu'un rencontre-t-il le même souci?
    Cordialement,
    Franck
      0  1

  17. #177
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    non c'est normal ca consomme beaucoup d'uc cette méthode

    le rapport mémoire /processeur est diffèrent qu'avec collection

    avec les formules le proc est plus sollicité
    tu a quoi comme proc une AMD ou intel
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter
      0  1

  18. #178
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    A Franck

    Juste une petite question : à quelle instruction Randomize as-tu associé la fonction rnd , pour tes essais ?

    EDIT : petite mise au point et/ou rappel en ce qui concerne les nombres aléatoires. Rien n'est plus hasardeux que de les traiter par l'informatique, du fait même de la répétition de ce sur quoi on assoit l'aléa.
    C'est là un VRAI problème, dont il faut avoir conscience. Personne, jusqu'à présent, n'est parvenu avec un simple ordinateur, à tirer, sur une très longue série de tirages, un nombre à peu près égal de tirages pour chacun des éléments composant l'ensemble sur lequel on procède au tirage.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
      0  1

  19. #179
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par unparia Voir le message
    Juste une petite question : à quelle instruction Randomize as-tu associé la fonction rnd , pour tes essais ?
    Tout comme toi, au Timer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Remplissage(n As Long, x As Integer)
    'remplit la feuille
    Dim i As Long, k As Long, L() As String
     
        ReDim L(0 To n, 0 To 4)
        Randomize Timer
        For i = 0 To n
          For k = 0 To 4
            L(i, k) = Chr(Int((x * Rnd) + 65))
          Next
        Next
        Application.ScreenUpdating = False
        Range("A1").Resize(n + 1, 5) = L
        Application.ScreenUpdating = True
    End Sub
    Citation Envoyé par patricktoulon
    non c'est normal ca consomme beaucoup d'uc cette méthode
    Salut Patrick,
    Ce n'est pas cela que je pointe, mais la différence de durée d'exécution entre x = 7 et TOUTES les autres valeurs comprises entre 1 et 26...
    J'ai retenté maintes fois, toujours le même résultat.
    Cordialement,
    Franck
      0  1

  20. #180
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Lis mon edit au-dessus, Franck.

    EDIT : ce sujet (les aléas et l'informatique) est TRES intéressant.
    Il mérite une discussion/conversation totalement dédiée.
    Si tu ouvres une telle discussion, j'y participerai avec enthousiasme. Mais attends-toi à des analogies surprenantes, en passant par des exemples non moins surprenants (y compris les ponts, les vilons et bien d'autres "petites" choses, au risque de me faire traiter de tous les noms "d'oiseau" (tu en veux quelques-uns ? -->> Fou, poéte, obsédé, etc ...)
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.
      0  1

Discussion fermée
Cette discussion est résolue.
Page 9 sur 11 PremièrePremière ... 567891011 DernièreDernière

Discussions similaires

  1. Identifier les doublons dans une requete
    Par totor92290 dans le forum IHM
    Réponses: 2
    Dernier message: 27/10/2016, 12h08
  2. Comment réperer les doublons dans une base de données?
    Par Marc31 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 16/07/2015, 16h29
  3. [Débutant] Eviter les doublons dans une base access
    Par gilles_906 dans le forum VB.NET
    Réponses: 24
    Dernier message: 29/08/2011, 16h46
  4. Réponses: 0
    Dernier message: 09/02/2011, 09h13
  5. les images dans une base de données
    Par houhou dans le forum Bases de données
    Réponses: 8
    Dernier message: 22/06/2004, 14h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo