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. #201
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Il arrive, Franck, que l'on se focalise tellement sur ce que l'on croit voir, que, comme dans la grotte de Platon, on ne voit plus ce qui est là
    Oublie donc tout le reste et fais ce simple petit test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub CommandButton1_Click()
      Dim x As Long
      x = 8192 * 4
      MsgBox x
    End Sub
    Tu auras la même erreur, pardi. Et tu l'aurais également avec VB, y compris hors VBA (avec VB5 ou VB6, par exemple).
    Je te suggère donc (et dans cet ordre) :
    - un bol d'air (avec des embruns, si possible)
    - de sérier ensuite les choses dans chaque ensemble de choses.

    Je sais qu'il est toujours assez difficile d'extraire d'un contexte étrange la seule partie qui l'est finalement, dans l'ensemble des parties qui composent un contexte.
    Mais tu y parviendras. Même l'hyper nerveux que je suis y est parvenu ... C'est te dire ...
      0  1

  2. #202
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    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 169
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par pijaku Voir le message
    Autre souci décelé depuis l'utilisation de cette fonction :
    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
    Bonjour,

    ce n'est pas la variable qui est en cause, c'est le mécanisme de calcul. Les codes de unparia ne sont pas incriminés

    1) VBA va évaluer l'opération située à droite de l'égalité
    2) par simplicité, il va utiliser le type de données le plus "petit possible" ==> donc il multiplie deux integer car ce sont des chiffres et non des variables déjà typées
    3) le résultat de cette multiplication dépasse la capacité d'un integer
    4) on obtient un dépassement de capacité avant même que VBA tente d'affecter le résultat à ta variable x ... puisqu'il n'est déjà pas en mesure de stocker le résultat "temporairement avant affectation"

    Pour contourner ce type de problème, il te suffit de placer un Clng() sur l'un des deux nombres, ainsi VBA fera son calcul sur du Long
      0  0

  3. #203
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour ami joe.levrai
    Tu t'es fait "doubler" par un vieillard ....
    (Bon ... d'à peine une minute, il est vrai ...)
    Amitiés
      0  1

  4. #204
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    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 169
    Billets dans le blog
    5
    Par défaut
    Mon clavier souffre de rhumatismes
      0  0

  5. #205
    Expert éminent
    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
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    il te suffit de placer un Clng() sur l'un des deux nombres
    Ou encore x = 8192& * 4
      0  1

  6. #206
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    @Jacques et Joe et Marc

    Exact...
    Cet autre test le prouve également :
    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 Byte, 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
    Le pire est que j'ai répondu à une question de ce type il y a peu...

    Désolé de l'éparpillement, sur ce, je vais faire un tour...dans l'air pollué de ma ville (pas d'embrun par ici, juste du brouillard...).

    Par contre, cette question reste valide, je ne peux plus faire ce test :
    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.
      0  1

  7. #207
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Mon clavier souffre de rhumatismes
    Si tu voyais le mien ! Ce malheureux ...!
    - Les cendres de mes cigarettes tombées entre les touches + un peu d'humidité = colle qui les fait frapper à l'infini et il m'arrive de devoir les relever à l'aide d'une pointe de couteau que j'ai toujours à portée de main pour faire face à ces "accidents"
    - il m'arrive de tâtonner pour trouver certains caractères spéciaux : les caractères (tous) étaient pourtant bien blancs sur fond noir au départ. On distingue aujourd'hui à peine le blanc du noir, le blanc s'étant peu à peu quasi effacé du fait de nombreux facteurs ( je jardine, pêche et bricole = impuretés abrasives sur les doigts + je ne "caresse" pas mon clavier et on m'entend frapper les touches à au moins trois mètres à la ronde).
    Bref ... Je trouve que le matériel est tout de même plus résistant que ce que l'on croit, finalement
      0  1

  8. #208
    Expert éminent
    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
    Par défaut


    Heureusement ce n'est pas un ordinateur portable ‼
      0  1

  9. #209
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    re
    une bombe d'air propre vendu moins de 7 € dans les e. boutique un coup avec la canelure entre les touche et ca repart

    pour les lettres sur les touche des decalco a gratter ,j'ai refait une dizaine de touche comme ca
    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

  10. #210
    Expert éminent
    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
    Par défaut

        Mea culpa !    

    Dans le post #167 en page 9 seule la procédure TriDoublonsUnparia était correcte !

    Je ne sais pas comment je me suis débrouillé - bon vu l'heure aussi du post je n'étais pas à 100 % - mais
    mes deux autres procédures TriDoublons et SuppressionDoublons avaient conservé le problème de tri
    alors que dans mon classeur enregistré ce sont les bonnes versions !

    Voilà, cela vient d'être mis à jour dans le post d'origine, merci encore à Pierre Fauconnier pour la manipulation.
    (Aucune incidence sur les tests effectués …)

    Culpa mia …
      0  1

  11. #211
    Expert éminent
    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
    Par défaut
    Citation Envoyé par unparia Voir le message
    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 ?
    Comme j'ai déjà vu des codes matrice + tri en mémoire plus lents que le standard Excel, pas trop emballé …

    Comme j'ai déjà sous le coude tout le nécessaire, j'ai effectué une procédure hybride avec un tri QuickSort
    sur une matrice à deux dimensions contenant juste la concaténation et le numéro de ligne
    puis en créant une nouvelle matrice d'une colonne repérant les lignes à supprimer
    pour au final appliquer la même méthode de suppression des doublons comme la procédure SuppressionDoublons (1,293s)
    via le tri classique d'Excel et elle s'est avéré un peu plus longue pour 65 536 lignes : 1,527s …

    Faudrait peut-être voir avec une procédure non hybride et toute en mémoire …

    Point important : le tri QuickSort ne conservant pas forcément l'ordre d'origine, à ne pas négliger dans certains contextes.
      0  1

  12. #212
    Membre Expert
    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
    Par défaut
    Bonjour,

    Mise à jour des tests fait sur mon Mac Post #168 avec :

    • Initialisation des données (Jacques)

    - TriDoublonsUnparia

    Nom : TriDoublonsUnparia 2017-01-22.png
Affichages : 120
Taille : 31,0 Ko

    TriDoublons

    Nom : TriDoublons 2017-01-22.png
Affichages : 116
Taille : 15,7 Ko

    SuppressionDoublons

    Nom : SuppressionDoublons 2017-01-22.png
Affichages : 121
Taille : 14,1 Ko


    • Initialisation des données (Marc)

    - TriDoublonsUnparia

    Nom : TriDoublonsUnparia 2017-01-22_2.png
Affichages : 123
Taille : 31,4 Ko

    TriDoublons

    Nom : TriDoublons 2017-01-22_2.png
Affichages : 113
Taille : 15,1 Ko

    SuppressionDoublons

    Nom : SuppressionDoublons 2017-01-22_2.png
Affichages : 108
Taille : 14,1 Ko


    Chose étonnante, selon l'initialisation des données (code Jacques ou code Marc) sur 200 000 lignes les temps diffères … ?
    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 :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)
      0  1

  13. #213
    Expert éminent
    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
    Par défaut

    Cela ne m'étonne pas car comme je l'ai déjà évoqué précédemment,
    mieux vaut partir de la même base pour comparer différentes procédures
    car d'une génération aléatoire à une autre effectivement les temps peuvent différer …
      0  1

Discussion fermée
Cette discussion est résolue.
Page 11 sur 11 PremièrePremière ... 7891011

Discussions similaires

  1. Identifier les doublons dans une requete
    Par totor92290 dans le forum IHM
    Réponses: 2
    Dernier message: 27/10/2016, 13h08
  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, 17h29
  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, 17h46
  4. Réponses: 0
    Dernier message: 09/02/2011, 10h13
  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, 15h27

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