Dictionnary : Recherche iD

re,

bon, je suis d'accord avec les remarques de @mafraise.

La comparaison des temps en cent millièmes de secondes, c'était pour rigoler (voir l'émoticon).

J'ai modifié plusieurs choses dans mes fonctions et j'ai remarqué que les temps d'exécutions pour les colonnes H:K ne sont pas vraiment stable (écart de plusieurs secondes) pendant plusieurs répétitions (j'avais redémarré mon ordinateur et sans internet pour éliminer les causes).

Ma formule en colonne L montre maintenant les 4 premiers ID's de la colonne A, sans priorité pour nom, nom2 ou nom & " " & nom2, mais je peux encore modifier la formule. PS. les Id sont identiques (même ligne dans chaque colonne) ne sont qu'un ID dans la fonction

Ma fonction BSALV utilise maintenant aussi les noms des 3 plages

Donc, vous avez le luxe de choisir (quoi faire avec les ID's multiple et priorité nom/nom2/combinaision)

bonsoir,

Désolé pour les réponses tardives. Je ne suis guère disponible.

Loureed : Je veux dire par là... Que je n'ai que l'embarras du choix et que je me débrouillerai bien...

C'était juste pour vous arrêter dans vos recherches j'ai assez de pistes comme ça. Je ne comps pas vous sous traiter mes problèmes !

En fait le projet à un peu évolué (Je ne suis pas le maitre d'oeuvre, juste l'exécutant) et dans leur grande majorité les iD étant supposées connues, j'ai relégué cette question au second plan.

Il n'en reste pas moins que des comparaisons sur diverses pratiques de recherche ne sont pas inintéressantes si ontles appliques sur des bases de données réalistes...

Encore merci à tous.

Bonsoir galopin01,

Je parlais essentiellement du "même si elles ne comportent pas de dictionnary", car la mienne en comportait, c'est tout, c'était juste "pour relever" !

Bon courage à vous, car c'est difficile de se lancer dans un projet quand celui-ci n'est pas stable ! Jen fais actuellement l'amère expérience !

@ bientôt

LouReeD

Bonsoir,

Sans vouloir m'incruster dans cette conversation, et sans chercher a avoir la fonction la plus rapide, voici ma méthode pour répondre à la demande en identifiant les doublons, on pourrait aussi limiter le nb de doublons à l'affichage :

Function LouReeD2(Val As String)
    Dim dico As Object, Nom As String, i As Long, c As Long, arrPlage As Variant, Itm As String

    If Val = "" Then Exit Function

    Set dico = CreateObject("Scripting.Dictionary")
    dico.comparemode = vbTextCompare ' Equivaut à Option Compare Text

    arrPlage = Sheets("Feuil1").ListObjects(1).DataBodyRange
    For i = 1 To UBound(arrPlage, 1)
        For c = 2 To UBound(arrPlage, 2)
            Itm = arrPlage(i, c)
            If dico.exists(Itm) Then
                dico(Itm) = dico(arrPlage(i, c)) & "." & arrPlage(i, 1)
            Else
                dico(Itm) = arrPlage(i, 1)
            End If
        Next c
    Next i
    If dico.exists(Val) Then LouReeD2 = dico(Val) Else LouReed2 = "Nom Inconnu"
End Function
  • J'ai repris la fonction de LouReed pour faire simple, merci à lui.
  • J'ai ajouté dico.comparemode pour ne pas tenir compte de la casse
  • Je teste l'existence de la valeur et si elle existe, je la concatène avec le résultat antérieur.
  • Cela donne par exemple "11.104" pour GOURMAND ou gourmand en créant un doublon dans le fichier originel en mettant GOURMAND en C7. Deux ID correspondent 11 et 104.

Comme il a déjà été dit, dans le cas d'une procédure avec de multiples appels à la fonction, il faut mettre la création du dictionnaire en début de Sub, surtout pas dans la fonction, sinon gare aux ralentissements.

Benead

Bonsoir,

Oui c'est une idée. Au départ je m'orientais vers un truc comme ça avec le find de Thev (je crois). J'aime bien cette idée de concaténer des petites listes pour les récupérer ensuite avec split...

J'en ai d'ailleurs une à vous soumettre qui m'embête bien aussi, mais c'est une autre histoire. Je vous la soumettrai prochainement car c'est une truc que je pratique assez communément et qui pour le coup me cause des soucis...

A+

re, c'est une histoire sans arrêt ...

J'ai fait un teste et je considère une source variable, le tableau3 s'arrêtera à la ligne 10, 100, 500 et 1114 pour voir cette influence. Puis, il y a 2 fonctions qui donnent "multiples résultats", la FiltrerNom et LouReeD2 (dont la plage n'est pas un variable dans la fonction comme mafraise le veut, sorry, mais pas de grand influence ici). Je suppose que on fait un recherche unique, donc on crée le dictionaire ou la matrice pour un nom unique !!!

Je fais un boucle de 1.000 fois pour chaque combinaison, le résultat vous pouvez le voir dans le tableau "Tabel1" et le graphique. Un recherche, ça dure entre 0.92 et 6.62 millisecondes , donc des différences minimes !!!

Le dictionaire est un instrument légèrement plus volumineux (voir les coefficients de pente des droits, les 2 sont plus élevés) à la matrice, mais "les goûts et les couleurs ne se discutent pas."

Macro "Testing" dans module2

PS. à cause du "transpose" dans ma fonction "FiltreNom" , la source est limitée à 64K lignes

Bonsoir BsAlv ,

Intéressante démarche !

J'étais un fanatique du "dictionary" jusqu'à ce que ce que qu'on me fasse remarquer que Apple ne dispose pas de la structure "dictionary". Depuis je le le propose un peu moins.

SI on construit le dictionary avant son utilisation dans la fonction, il faut absolument gérer les changements au sein de la source sinon la fonction risque de retourner une valeur erronée quand on modifie les données sources. Donc on ajoute du code dans des procédures évènementielles. Ai-je tort ?

re,

pour la 2ième question, je n'aime pas non plus l'idée de créer un dictionaire ou une matrice et le/la conserver quelque part dans le frigo. A quel moment faut-on le/la renouveller ? La création ne coûte que 1 à 6 millisecondes dépendant du largeur de la source. Si nécessaire, on peut le créer et déclarer public pour qu'il reste accessible pendant l'exécution de plusieurs macros et puis dans la poubelle.

Apple, il connait des collections ou autres alternatives ? Il y a une autre chose que je n'aime pas à un dictionaire, c'est quand il ne contient qu'un key et l'item est un array 1D et je récupère les items avec application.index, il faut doubler ce premier key

J'ai testé une autre chose : si on a son dictionaire ou matrice et on veut l'utiliser plusieurs fois, cela prend combien de temps ? (de 1 à 20.000 fois, voir PJ) Pour un dictionaire, c'est 5E-7 sec par fois, donc c'est zéro. Pour la matrice, c'est 0.2 millesecondes par recherche. Comme on avait un écart de 1 à 3 millisecondes entre la matrice et le dictionaire, à partir de 5-15 recherches, le dictionaire est plus puissant/favorable. (dans cette situation).

Bonjour à tous,

@BsAlv, j'ai fait mes propres tests, car je fais beaucoup de traitement de ce type pour mon boulot et au final je suis très intéressé pour réduire le temps de traitement des données quand cela dépasse la dixaine de minute et surtou répétitif. J'ai comparé ta solution avec le dictionnaire et aussiune collection, le dictionnaire est le plus puissant suivi de très près de la collection (plus rapide quand elle est petite), et la matrice prend de plus en plus de temps quand le nombre de ligne augmente, je suis allé jusqu'à 30000. La principale modification que j'ai apporté est de sortir la création du dictionnaire et de la matrice de la fonction et mis dans la boucle primaire, voici le résultat :

lignesBSALVDictColl
100,0080,0080,000
1000,0350,0040,000
5000,1520,0080,004
10000,2930,0080,012
100003,0820,0590,133
300009,3200,1680,410

Si la matrice est plus performante dans une feuille Excel, le dictionnaire est la plus intéressante dans une sub sur des données statiques.

Benead

re, amusant

vous utilisez quelle macro et vous testez quoi, la création d'une matrice/dictionaire/collection et puis la recherche d'un élément ?

Rechercher des sujets similaires à "dictionnary recherche"