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. #181
    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
    Jacques,
    Oui, je l'ai lu, compris.
    Mais, si c'est juste un souci "d'aléatoirisation", le souci serait, lui aussi, aléatoire.
    Cela lui prendrais également de temps à autre avec x = 16 ou x = 9.
    Mais là, c'est juste 7 le chiffre "porte malheur".

    Je ne me l'explique pas...
    Mais, tu me connais, je vais insister jusqu'à mes limites...

    D'autres tests me donnent (encore) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    6,722656 secondes pour x = 5
    1551 aera 
    134,1445 secondes pour x = 7
    1 aera 
    14,19531 secondes pour x = 8
    1 aera 
    9,605469 secondes pour x = 6
    3893 aera 
    177,418 secondes pour x = 7
    1 aera 
    13,30469 secondes pour x = 8
    1 aera
    Pour "pallier" à une erreur de ma part et, comme ma fonction diffère un peu de la votre (pas par la méthode, mais par l'ajout de paramètres etc...), je vous confie, à des fins de tests, le code entier de mon module :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    Option Explicit
     
    Public Sub Exemple_D_Appel()
    Dim Plage As Range, RngResult As Range, DL As Long, x As Integer
    Dim T As Single
     
        For x = 6 To 8
            'initialise les données dans la feuille
            Efface_Tout
            Remplissage 200000, x   '====> Données à faire évoluer pour voir les résultats
            'variables
            T = Timer
            DL = Range("A" & Rows.Count).End(xlUp).Row
            Set Plage = Range("A1:E" & DL) 'Union(Range("A1:A" & DL), Range("C1:C" & DL), Range("E1:E" & DL), Range("G1:H" & DL))
            'lance le traitement
            Set RngResult = PlageDesDoublons(Plage, "#", True, "J", "K")
            'annonce les résultats
            Debug.Print Timer - T & " secondes pour x = " & x
            Debug.Print RngResult.Areas.Count & " aera " '& RngResult.Address
        Next
        'test du résultat de la fonction
        'RngResult.EntireRow.Select
    End Sub
     
    Private Function PlageDesDoublons(PlageATraiter As Range, _
                                      Separateur As String, _
                                      Doublons As Boolean, _
                                      ParamArray ColonnesIntermediaires() As Variant) As Range
     
    Dim c As Range, FormConc As String, Verif As String, n As Long, T, i As Long
    Dim p1 As Range, p2 As Range, p3 As Range
     
        Application.ScreenUpdating = False
     
        With PlageATraiter.Parent
            'vérifications d'usage des paramètres passés à la fonction
            On Error GoTo Rejet
            Verif = PlageATraiter.Address
            .Columns(ColonnesIntermediaires(0)).ClearContents
            .Columns(ColonnesIntermediaires(1)).ClearContents
            On Error GoTo 0
            If .Columns(ColonnesIntermediaires(0)).Offset(, 1).Address <> .Columns(ColonnesIntermediaires(1)).Address Then
                GoTo Eject
            End If
            '--------------------------------------------
     
            'variables utiles
            n = PlageATraiter.Rows.Count
            For Each c In PlageATraiter.Columns
                FormConc = FormConc & Replace(Split(c.Address, ":")(0), "$", "") & "&" & """" & Separateur & """&"
            Next
            FormConc = "=" & Left(FormConc, Len(FormConc) - 5)
            Set p1 = .Range(ColonnesIntermediaires(0) & "1:" & ColonnesIntermediaires(0) & n)
            Set p2 = .Range(ColonnesIntermediaires(1) & "1:" & ColonnesIntermediaires(1) & n)
            Set p3 = .Range(ColonnesIntermediaires(0) & "1:" & ColonnesIntermediaires(1) & n)
            '--------------------------------------------
     
            'Traitement        
            On Error GoTo Erreur_Separateur
            p1.Formula = FormConc
            On Error GoTo 0
     
            p2.Formula = "=ROW()"
            p3.Value = p3.Value
            p3.Sort key1:=p3, order1:=xlAscending, Header:=xlNo
            T = p3
            For i = n To 2 Step -1
              If T(i, 1) = T(i - 1, 1) Then T(i, 1) = ""
            Next
            p3.Value = T
            p3.Sort key1:=p2, order1:=xlAscending, Header:=xlNo
            On Error GoTo PlageVide
            If Doublons Then
                Set PlageDesDoublons = p1.SpecialCells(xlCellTypeBlanks)
            Else
                Set PlageDesDoublons = p1.SpecialCells(xlCellTypeConstants)
            End If
            On Error GoTo 0
            .Columns(ColonnesIntermediaires(0)).ClearContents
            .Columns(ColonnesIntermediaires(1)).ClearContents
        End With
            '--------------------------------------------
     
        'Fin
        Application.ScreenUpdating = True
        Exit Function
     
    'Traitement d'erreur des paramètres
    Eject:
        Application.ScreenUpdating = True
        MsgBox "Les colonnes intermédiaires doivent être contigues", vbCritical
        Set PlageDesDoublons = Nothing
        Exit Function
    Erreur_Separateur:
        Application.ScreenUpdating = True
        MsgBox "Le séparateur choisi n'est pas valide pour la fonction.", vbCritical
        Set PlageDesDoublons = Nothing
        Exit Function
    Rejet:
        MsgBox "L'un des (ou tous les) paramètres est incorrect.", vbCritical
    PlageVide:
        Application.ScreenUpdating = True
        Set PlageDesDoublons = Nothing
            '--------------------------------------------
    End Function
     
    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
        'insère colonnes et lignes vides pour tester ==> Inutile
        'Columns("B:B").Insert Shift:=xlToRight
        'Columns("D:D").Insert Shift:=xlToRight
        'Columns("F:F").Insert Shift:=xlToRight
        'Rows("14:28").Insert Shift:=xlDown
        Application.ScreenUpdating = True
    End Sub
     
    Private Sub Efface_Tout()
        Cells.Clear
    End Sub
    Cordialement,
    Franck
      0  1

  2. #182
    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
    Mais, si c'est juste un souci "d'aléatoirisation", le souci serait, lui aussi, aléatoire
    Hé non ! car les conditions de détermination de l'aléa se trouveront elles-mêmes "cadencées. Et pour peu que la fréquence des instructions entre en "presque résonnance" avec celle de la cadence, on se retrouve bien plus fréquemment avec le même "aléa" (d'où mon allusion aux ponts, aux violons ...).
    Certains "quenistas" amoureux de musique de l'altiplano, te parleront alors peut-être de la raison pour laquelle certains queshuas ont ("superstitieusement", mais pas que) choisi, pour conjurer le "mauvais sort", certaines mesures qui ne sont pas seulement syncopées. Car la musique elle-même subit, si l'on n'y prend garde, une cadence dont les superstitieux veulent se "débarrasser" à certaines occasions ... Etonnant, non ?
    Autre discussion (distincte) ? Elle sera TRES TRES TRES longue ...
    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

  3. #183
    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
    Jacques,
    J'ouvrirais volontiers cette discussion, pas aujourd'hui, mais en début de semaine prochaine.
    Juste pour ma compréhension.
    Mais, ici, le chiffre 7 ne produit aucun doublon.
    Tout comme le chiffre 9.
    En tout cas dans chacun des tests que j'ai effectué.
    Je me doute, qu'aléatoirement, il doit y en avoir.

    Mais ici, le souci (que j'ai réussi à isoler), se trouve sur la méthode SpecialCells.
    Donc rien à voir avec une quelconque résonance. [à mon sens en tout cas]
    Mes tests :
    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
     
    4,371094 secondes pour x = 1 '=====> test juste pour la "forme"
    Set PlageDesDoublons = p1.SpecialCells(xlCellTypeBlanks) : 0,03125 sec
    1 aera  '=====> normal !!!!
    '-----------------------------------------------------------------------------------
    6,644531 secondes pour x = 5
    Set PlageDesDoublons = p1.SpecialCells(xlCellTypeBlanks) : 0,484375 sec
    1515 aera 
    '-----------------------------------------------------------------------------------
    104,7227 secondes pour x = 7
    Set PlageDesDoublons = p1.SpecialCells(xlCellTypeBlanks) : 98,23438 sec
    1 aera 
    '-----------------------------------------------------------------------------------
    10,28125 secondes pour x = 9
    Set PlageDesDoublons = p1.SpecialCells(xlCellTypeBlanks) : 3,195313 sec
    1 aera
    Au passage, on notera que la méthode SpecialCells y est pour beaucoup dans les palliers découverts lors de mon premier test.
    J'y ajoute, par ailleurs, un 4ème pallier pour x = 7.

    Bon, j'ai l'explication.
    En fait, la méthode SpecialCells n'est pas en cause.
    Le souci vient du nombre maximum d'areas possible dans un Range : 8192.
    Dans mon exemple, x = 7 nous donne 183 194 lignes vides. Ce nombre de lignes vides influe nécessairement sur le nombre d'areas.
    S'il est supérieur à la limite, Excel nous retourne le Range entier, comme nous le prouve ce test :
    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
    Sub test()
    Dim Rng As Range, Tb(1 To 200000, 1 To 1), i&
    Dim x&
     
    x = 8192 * 2
    For i = 1 To x Step 2
        Tb(i, 1) = "pppp"
    Next
    Range("A1").Resize(x, 1) = Tb
    Set Rng = Range("A1:A" & x).SpecialCells(xlCellTypeBlanks)
    MsgBox Rng.Address
     
    x = 8193 * 2
    For i = 1 To x Step 2
        Tb(i, 1) = "pppp"
    Next
    Range("A1").Resize(x, 1) = Tb
    Set Rng = Range("A1:A" & x).SpecialCells(xlCellTypeBlanks)
    MsgBox Rng.Address
    End Sub
    Il convient donc OBLIGATOIREMENT d'y penser et de traiter ce cas!
    Cordialement,
    Franck
      0  1

  4. #184
    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
    Citation Envoyé par RyuAutodidacte Voir le message
    Passe moi la nouvelle version je testerai.
    En fait j'ai édité directement mon post (#167).

    J'ai effectué des tests sur un autre PC avec des versions d'Excel et de Windows plus récentes.

    Surprise : mon code d'initialisation sous la version 2010 se tamponne royalement du Randomize
    me générant à chaque fois une série différente alors que sous 2003 c'est toujours la même série !

    Mais comme annoncé par Unparia, après avoir effectué plusieurs tests de chacune des procédures,
    les temps varient peu ou prou, ils sont vraiment stables :

    Procédures 65 536 lignes 200 000 lignes
    TriDoublonsUnparia 1,500s 5,219s
    TriDoublons 0,891s 2,797s
    SuppressionDoublons 0,938s 2,988s

    _________________________________________________________________________________________________________
    C’est ce que nous pensons déjà connaître qui nous empêche souvent d’apprendre. (Claude Bernard)
    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

  5. #185
    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
    En fait, quand d'Areas est supérieur à 8192 Areas.Count retourne 1.
    Par conséquent, il conviendrait de boucler sur plusieurs plages du Range donné en paramètre.
    ==> Récursivité.
    Qui s'y colle ?

    Par contre, là je sèche car Excel va bloquer sur ce simple test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If monRange.SpecialCells(xlCellTypeBlanks).Areas.Count <> 1 Then
    Cordialement,
    Franck
      0  1

  6. #186
    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

    D'après toi Franck, pourquoi j'évite souvent d'utiliser la méthode SpecialCells ?!

    Dans la procédure TriDoublonsUnparia du post #167 c'est elle qui allonge bien le temps d'exécution,
    voir aussi les résultats des tests sur un autre PC post #184 …
    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

  7. #187
    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
    Ah ! je "vois" enfin de quoi tu parles (mon nez bouché m'a rendu moins réactif) et comprends maintenant moins mal le lien qui était fait avec les aléas.
    La difficulté rencontrée n'est pas celle des aléas, mais celle des effets de morcellement résultant de la répartition trop morcelée des doublons, que cette répartition résulte d'aléas ou de n'importe quoi d'autre.
    Mais tu la connais, Franck, la solution (il me semble l'avoir un jour montrée en un lieu et en avoir parlé à nouveau récemment en un autre)...
    Je reviens dans quelques instants avec une petite démonstration.

    A Franck
    Beaucoup de temps perdu à essayer de retrouver où j'ai déposé un truc pareil.
    Peu importe, j'en bâcle un petit, en exemple
    regarde la différence entre un bouton de commande et l'autre

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Private Sub CommandButton1_Click()
      Dim toto(), plage As Range
      nb = 20011
      ReDim toto(1 To nb, 1 To 2)
      For i = 1 To nb Step 2
        toto(i, 1) = "coucou"
      Next
      Range("A1:A" & nb).Value = toto
      Set plage = Range("A1:A" & nb).SpecialCells(xlCellTypeBlanks)
      For Each a In plage.Areas
        nbr = nbr + a.Rows.Count
      Next
      MsgBox nbr & "  " & plage.Address
      plage.Select
    End Sub
     
     
    Private Sub CommandButton2_Click()
      Dim toto(), plage As Range, i As Long
      nb = 20011
      ReDim toto(1 To nb, 1 To 2)
      For i = 1 To nb Step 2
        toto(i, 1) = "coucou"
      Next
      Range("A1:A" & nb).Value = toto
      For i = 1 To nb - 10000 Step 10000
        If plage Is Nothing Then
          Set plage = Range("A" & i & ":A" & i + 10000).SpecialCells(xlCellTypeBlanks)
          plage.Select
        Else
          Set plage = Union(plage, Range("A" & i & ":A" & i + 10000).SpecialCells(xlCellTypeBlanks))
        End If
      Next
      plage.Select
      Set plage = Union(plage, Range("A" & i & ":A" & nb).SpecialCells(xlCellTypeBlanks))
      For Each a In plage.Areas
        nbr = nbr + a.Rows.Count
      Next
      MsgBox nbr & "  " & plage.Address
      plage.Select
    End Sub
    Ah ! Les bulles remontent à la surface en dépit du rhume.
    Il s'agissait du dépôt d'un code montrant comment recenser les lignes non visibles, y compris dans un contexte de grand "fractionnement" sur un grand nombre de cellules. Je pense que tu le retrouveras.
    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

  8. #188
    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 tout le monde

    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 …
    Marc en fait ton post n'est pas marqué en modifié donc je pensais que le code de TriDoublons était le même et m'attendais à voir un nouveau post avec les modif
    Du coup j'ai vérifié avec un compare file en reprenant le code que j'avais et celui en post (bien modifié).
    je t'ai refait les tests sur (Mac) lancé x 2 pour voir ce qu'il en est : résultat :

    TriDoublons (L'ancien code):

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


    TriDoublons2 (test 1):

    Nom : TriDoublons2_1.png
Affichages : 158
Taille : 15,5 Ko


    TriDoublons2 (test 2):

    Nom : TriDoublons2_2.png
Affichages : 166
Taille : 18,0 Ko

    Comme tu le vois une légère amélioration; mais pas sur que se soit celle voulu … ?

    PS : si veux que je refasse les test sur mon Mac mais en boot window 10 (non virtualisé) avec Excel 2010, dis le moi pas de souci

    voilà
    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. #189
    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 :
    Je reviens sur ton message 179 et ma réponse au sujet de la constitution d'une plage avec spécialcells :
    En fait, quand d'Areas est supérieur à 8192 Areas.Count retourne 1.
    La limite du nombre d'aires n'est pas la cause directe, mais la conséquence d'une cause en amont : la limite du nombre de lignes concernées par l'application de specialcells.
    Et la limite du nombre de lignes concernées par l'application de specialcells résulte de celle d'un entier. Elle est la moitié de la limite d'un entier
    Pourquoi la moitié ? parce-que la lecture de specialcells se fait par blocs de lignes dont le nombre maximum est celui d'un entier et que dans chacun de ces blocs, il n'est par définition pas possible d'avoir des sous-blocs en nombre excèdant celui de la moitié du nombre de lignes du bloc.
    Le voilà, ton 8192 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim limite_entier As Long, limite_lignes As Long, limite_aires As Long
    limite_entier = 32767
    limite_lignes = limite_entier / 2
    limite_aires = limite_lignes / 2
    MsgBox "nb max lignes " & limite_lignes & vbCrLf & " d'où pas plus de " & limite_aires & " aires"
    Lance maintenant ces lignes de code après avoir constitué en colonne A nos vides/pas vides intercalés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set plage = Range("A1:A16385")
          Set vides = plage.SpecialCells(XlCellType.xlCellTypeBlanks) 
            MsgBox vides.Cells.Count & " tu as le bon compte"
     Set plage = Range("A1:A16386") ' une seule cellule vide de plus et patatras 
          Set vides = plage.SpecialCells(XlCellType.xlCellTypeBlanks) 
            MsgBox vides.Cells.Count & " tu les as erronément toutes"
    La parade existe (je t'en ai montrée une dans mon message précédent)
    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

  10. #190
    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
    Citation Envoyé par RyuAutodidacte Voir le message
    si veux que je refasse les test sur mon Mac
    Non c'est bon, merci Ryu !

    Je suis juste étonné entre tes résultats sur MAC où il n'y a aucune différence majeure entre mes procédures
    et mes résultats constatés sur deux ordinateurs Excel & Windows différents avec un écart pouvant aller du simple au double !


    A tous pour conclure, ma procédure SuppressionDoublons met moins de 3 secondes pour supprimer les doublons
    parmi 200 000 lignes hors la procédure TriDoublonsUnparia prend déjà 5,2 secondes juste pour les identifier
    dans une variable Range et, si Select est remplacé par Delete (ligne n°24)
    cette procédure a besoin alors de plus de 44 secondes pour réaliser la même opération !

    Comme énoncé par unparia, tout dépend aussi de la finalité …
    Une technique c'est bien, mais s'articuler d'abord sur l'objectif à atteindre c'est mieux !
    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

  11. #191
    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 pijaku :
    Regarde, Franck, ce que je viens de déposer ici (ailleurs également) :
    http://www.developpez.net/forums/d16...s/#post8897968

    J'attends avec une certaine "presque impatience" une remarque relative à l'utilisation du palliatif déposé (elle serait justifiée dans le cas que nous traitons) qui ne devrait normalement pas tarder, y compris un dimanche soir
    Je la verrai demain, cette remarque et ... montrerai comment procéder sans frais (et pourquoi) pour éviter ce qu'elle montrera du doigt
    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

  12. #192
    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
    Salut Jacques,
    J'ai été absent ce week end, désolé.
    Je te réponds vite fait ce soir et expliciterai ma réponse demain.
    Je vois déjà un petit souci dans ta fonction sur ce passage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If plage_specialcells Is Nothing Then
             Set plage_specialcells = plage_bloc
          Else
             Set plage_specialcells = Union(plage_specialcells, plage_bloc)
          End If
    Si l'une des deux plages, plage_specialcells ou plage_bloc est Nothing la méthode Union va planter...
    Mais bon, je n'ai pas regardé trop dans le détail, et, au pire, un simple On Error Resume Next devrait suffire...

    De plus, je crois avoir décelé une autre faille dans l'utilisation de Union, j'y reviendrai demain après d'autres tests.
    Sur ce, pour moi, c'est l'heure.
    Je te dis bonsoir, et à demain.
    Amitiés,
    Franck
    Cordialement,
    Franck
      0  1

  13. #193
    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
    Tu as zappé cette partie du code, Franck :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    On Error Resume Next ' pour le cas ou aucune cellule concernée
        Set plage_bloc = Range(p.Cells(dep, 1), p.Cells(fin, p.Columns.Count)).SpecialCells(nature, typ)
        On Error GoTo 0
        If Not plage_bloc Is Nothing Then
    C'était une autre remarque, que j'attendais; relative à l'utilisation dans le code objet de la présente discussion. . Je suis certain de ce qu'elle va finir par arriver

    Amitiés et bonne nuit.
    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. #194
    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,

    Citation Envoyé par Marc-L Voir le message
    A tous pour conclure, ma procédure SuppressionDoublons met moins de 3 secondes pour supprimer les doublons
    parmi 200 000 lignes hors la procédure TriDoublonsUnparia prend déjà 5,2 secondes juste pour les identifier
    dans une variable Range et, si Select est remplacé par Delete (ligne n°24)
    cette procédure a besoin alors de plus de 44 secondes pour réaliser la même opération !
    Chez moi : 26,58594 secondes pour Delete.

    Citation Envoyé par Marc-L Voir le message
    Comme énoncé par unparia, tout dépend aussi de la finalité …
    Une technique c'est bien, mais s'articuler d'abord sur l'objectif à atteindre c'est mieux !
    Je suis d'accord avec toi .
    Toutefois, dans ce sujet, je me suis pris au jeu de trouver le Range résultant, à titre d'exercice.
    Pour moi, peu m'importe la durée de traitement, cela me permet juste de mieux appréhender l'objet Range et ses méthodes et propriétés.

    Citation Envoyé par unparia Voir le message
    Tu as zappé cette partie du code, Franck :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    On Error Resume Next ' pour le cas ou aucune cellule concernée
        Set plage_bloc = Range(p.Cells(dep, 1), p.Cells(fin, p.Columns.Count)).SpecialCells(nature, typ)
        On Error GoTo 0
        If Not plage_bloc Is Nothing Then
    C'était une autre remarque, que j'attendais; relative à l'utilisation dans le code objet de la présente discussion.
    Salut Jacques,
    En effet, je n'ai pas pu tester hier étant sur mon téléphone...
    Oups!
    Alors les tests réalisés sur pc, ce matin nous donnent ces résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    'Debug.Print Timer - T & " secondes pour x = " & x & " et " & RngResult.Areas.Count & " areas" & " et " & RngResult.Cells.Count & " doublons"
    6,007813 secondes pour x = 1 et 1 areas et 200000 doublons
    6,910156 secondes pour x = 3 et 113 areas et 199758 doublons
    7,226563 secondes pour x = 5 et 1559 areas et 196876 doublons
    12,64063 secondes pour x = 7 et 8359 areas et 183196 doublons
    38,89063 secondes pour x = 9 et 27689 areas et 142875 doublons
    51,32422 secondes pour x = 11 et 40820 areas et 85161 doublons
    30,54688 secondes pour x = 13 et 31975 areas et 44787 doublons
    16,53906 secondes pour x = 15 et 20131 areas et 23896 doublons
    11,33984 secondes pour x = 17 et 12371 areas et 13654 doublons
    9,65625 secondes pour x = 19 et 7802 areas et 8292 doublons
    9,5625 secondes pour x = 21 et 5272 areas et 5467 doublons
    9,171875 secondes pour x = 23 et 3525 areas et 3610 doublons
    8,5 secondes pour x = 25 et 2645 areas et 2687 doublons
    Les nombres des doublons sont exacts, je l'ai vérifié par formule dans 3 de ces tests.
    Pour moi, pas de remarque relativement à ta fonction.
    Elle remplit son rôle, même si :
    1. On peut déplorer sa lenteur (induite par SpecialCells)
    2. Comment peut-on obtenir 44000 Areas (avec Areas.Count) alors qu'Excel même en fixe la limite à 8192?
    Cordialement,
    Franck
      0  1

  15. #195
    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 Franck
    Elle remplit son rôle, même si :

    On peut déplorer sa lenteur (induite par SpecialCells)
    Ah ! La voilà, la remarque que j'attendais avec impatience
    Et oui ! il faut à Excel presque autant de temps pour utiliser spécialcells sur une petite plage qu'il lui en faut sur une grande. Et donc : ce temps est à multiplier par le nombre des blocs obtenus par "découpage".
    Facheux pour l'utilisation qu'on en fait ici ? Pas vraiment et voici pourquoi :
    1) les cas de conjugaison (coexistence, donc) d'une énorme plage à traiter + contenant un énorme nombre de doublons + disséminés de telle manière que la plage des lignes vides contiendrait un tel nombre d'aires (areas) sont non seulement extrêmement rares, mais révèleraient une situation plutôt "pourrie" telle que l'on paierait fort volontiers des secondes de plus pour y remédier.
    2) Dans notre cas (celui des doublons), il ne faut pas lancer la fonction "palliative" systématiquement, mais que lorsque la chose est indispensable (infiniment rarement, donc).
    Comment le faire ? --->>>
    a) lancement habituel de la méthode specialcells --->> plage_obtenue
    b) si une seule aire (areas.count) = 1 et que cette aire (areas(1).cells.count) contient un énorme nombre de cellules, on sait qu'il faut lancer la fonction palliative pour corriger. Dans le cas contraire, pas la peine, puisque nous avons déjà la bonne plage.
    Et voilà ! De cette manière, on ne perd de temps que (cas très rare) si nécessaire compte tenu de ce que nous permet de constater l'utilisation "normale" de specialcells.

    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

  16. #196
    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
    Jacques,



    Qu'as-tu fait à mon Excel?

    Depuis que j'ai testé ta fonction, la propriété Areas de mon Excel "déconne"...
    En fait, je teste le nombre d'areas après la méthode SpecialCells, comme tu nous l'indiques dans ton message précédent.
    Voici comment je l'intègre dans mon code (p1 est un Range. Il correspond à la colonne de "concaténation") :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set PlageDesDoublons = p1.SpecialCells(xlCellTypeBlanks)
    Debug.Print "==> areasCount = " & PlageDesDoublons.Areas.Count
    If PlageDesDoublons.Areas.Count = 1 Then
        'ta fonction
    End If
    Et voici le résultat obtenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    pour x = 5 
    ==> areasCount = 1558
    pour x = 7
    ==> areasCount = 8416 '==========> ?????????
    pour x = 9
    ==> areasCount = 27623  '==========> ?????????
    pour x = 11
    ==> areasCount = 40698 '==========> ?????????
    pour x = 13
    ==> areasCount = 32012 '==========> ?????????
    C'est donc comme si, maintenant, et depuis l'essai de ta fonction, Excel avait, en quelques sortes, augmenté la limite d'Areas possibles de l'objet Range.

    Je vais redémarrer mon pc, pour voir si cela rétablit la "chose"...

    EDIT : Après redémarrage PC, le test suivant, réalisé dans un nouveau classeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    Dim i&, j&, Tb(1 To 200000, 1 To 2), Rng As Range, plage As Range
    For i = 1 To 20000 Step 2
        For j = 1 To 2
            Tb(i, j) = Chr(Int((7 * Rnd) + 65))
        Next j
    Next i
    Cells.Clear
    Range("A1").Resize(20000, 2) = Tb
    Set plage = Range("A1:B20000")
    Set Rng = plage.SpecialCells(xlCellTypeBlanks)
    Debug.Print Rng.Areas.Count
    End Sub
    Me retourne 10000 areas.
    Normal vous me direz...
    Pas au vu de mes dernières remarques sur le nombre maximum (8192) d'areas possibles dans Excel.
    Cordialement,
    Franck
      0  1

  17. #197
    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
    Qu'as-tu fait à mon Excel?
    Tu es en train de découvrir (il y aurait tout un roman à rédiger à ce propos) comment Excel "triche" en gardant en catimini en mémoire certaines choses pour te faire croire qu'il va plus vite ! (on en reparlera un jour, promis, juré). (Excel = tricheur jouant avec certaines petites choses, dont le fichier de pagination, sans l'avouer, bien sûr ...)
    Pour le reste : ne pas confondre nombre limite d'areas (toujours le même et égal à la moitié de la limite d'un Integer) avec taille limite d'un bloc à traiter, qui, elle,est à prévoir, en fonction du nombre de colonnes et en considérant la pire des disséminations.
    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

  18. #198
    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
    Autre souci décelé depuis l'utilisation de cette fonction :
    Ce test fonctionne bien et me donne les résultats surprenants indiqués après...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    Dim Rng As Range, Tb(1 To 200000, 1 To 1), i As Long, j As Long, x As Long
     
    For j = 2 To 5
        x = 8192 * j
        For i = 1 To x Step 2
            Tb(i, 1) = "pppp"
        Next
        Range("A1").Resize(x, 1) = Tb
        Set Rng = Range("A1:A" & x).SpecialCells(xlCellTypeBlanks)
        Debug.Print j & " - " & Rng.Areas.Count
    Next j
    End Sub
    2 - 8192
    3 - 12288
    4 - 16384
    5 - 20480
    Par contre, ce test plante pour un dépassement de capacité sur la ligne indiquée en commentaire, alors même que x est déclaré comme Long :
    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
    Sub test2()
    Dim Rng As Range, Tb(1 To 200000, 1 To 1), i As Long, x As Long
     
    x = 8192 * 2
    For i = 1 To x Step 2
        Tb(i, 1) = "pppp"
    Next
    Range("A1").Resize(x, 1) = Tb
    Set Rng = Range("A1:A" & x).SpecialCells(xlCellTypeBlanks)
    MsgBox Rng.Address
     
    x = 8192 * 4 'dépassement de capacité Erreur d'exécution 6
    For i = 1 To x Step 2
        Tb(i, 1) = "pppp"
    Next
    Range("A1").Resize(x, 1) = Tb
    Set Rng = Range("A1:A" & x).SpecialCells(xlCellTypeBlanks)
    MsgBox Rng.Address
    End Sub
    Cordialement,
    Franck
      0  1

  19. #199
    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
    Citation Envoyé par pijaku Voir le message
    Chez moi : 26,58594 secondes pour Delete.
    A comparer avec mes procédures TriDoublons et SuppressionDoublons prenant moins de trois secondes de mon côté !


    Citation Envoyé par unparia Voir le message
    Ah ! La voilà, la remarque que j'attendais avec impatience
    Déjà indiqué dans le post #186 expliquant les écarts constatés dans le post #184 dans un contexte de suppression de lignes …

    _________________________________________________________________________________________________________
    Quand vous citez un texte con, n'oubliez pas le contexte. (Jacques Prévert)
    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

  20. #200
    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
    Tu es en train de découvrir (il y aurait tout un roman à rédiger à ce propos) comment Excel "triche" en gardant en catimini en mémoire certaines choses pour te faire croire qu'il va plus vite ! (on en reparlera un jour, promis, juré). (Excel = tricheur jouant avec certaines petites choses, dont le fichier de pagination, sans l'avouer, bien sûr ...)
    Pour le reste : ne pas confondre nombre limite d'areas (toujours le même et égal à la moitié de la limite d'un Integer) avec taille limite d'un bloc à traiter, qui, elle,est à prévoir, en fonction du nombre de colonnes et en considérant la pire des disséminations.
    Oui, ça je l'avais bien deviné.
    Cependant, ça me pose problème ici car je ne peux plus réaliser le test dont tu parlais ici :
    Citation Envoyé par unparia Voir le message
    b) si une seule aire (areas.count) = 1 et que cette aire (areas(1).cells.count) contient un énorme nombre de cellules, on sait qu'il faut lancer la fonction palliative pour corriger.
    Et voir également mon autre petit souci, pour une explication, si elle existe...
    Cordialement,
    Franck
      0  1

Discussion fermée
Cette discussion est résolue.
Page 10 sur 11 PremièrePremière ... 67891011 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