XL 2013 CreateObject("scripting.dictionary") et/ou variable tableau ?

BenHarber

XLDnaute Occasionnel
Bonjour le Forum,
J'ai trouvé la fonction VBA suivante sur développez.net (merci Mchel M) qui me permet de compter sans doublon les enregistrements d'une plage de cellules. Elle fonctionne bien (même si je ne vois pas trop à quoi CreateObject("scripting.dictionary") correspond...)

A présent, je souhaiterais utiliser les différentes valeurs trouvées dans cette plage de cellules. Je pensais pour cela les enregistrer dans une variable tableau [du type : monTab(0 à n)] : ma question est de savoir si je peux pour cela utiliser "dico" (?) ou si je dois obligatoirement créer une nouvelle variable tableau ?
Merci d'avance pour vos idées toujours constructives !
BH
Function compter_uniques(plage As Range) As Long

Set dico = CreateObject("scripting.dictionary")
For Each cellule In plage
ref = cellule.Value
If Not dico.exists(ref) Then
dico.Add ref, ref
End If
Next
compter_uniques = dico.Count
End Function
 

dysorthographie

XLDnaute Accro
VB:
Dim Maliste As New Collection, MalisteExiste As String, valeur As String
valeur = "toto"
For i = 0 To 2
    If Not CBool(InStr(1, MalisteExiste, "©" & valeur & "©")) Then
        Maliste.Add valeur, valeur
        MalisteExiste = MalisteExiste & "©" & valeur & "©"
    End If
Next
 

Dranreb

XLDnaute Barbatruc
Je propose donc à ceux qui veulent tester
1583862810478.png

Ça confirme la stupéfiante découverte livrée par mes propres essais: au delà de 100000 éléments la Collection redevient plus performante que le Dictionary,
 

Pièces jointes

  • 1583862795094.png
    1583862795094.png
    3.1 KB · Affichages: 10

jmfmarques

XLDnaute Accro
Bonjour JM
C'est pas possible, mon PC est marabouté!
Fais comme moi : ne sois pas superstitieux car cela porte malheur ;)
Ne crois ni au maraboutage ni au fanatoutage (pour ceux qui connaissent) .
Il est tout simplement probable qu'un ou plusieurs "sorciers" ont installé sur ta machine tout un petit tas de petites bestioles diverses et variées. Tu peux essayer de les avoir à coup de boules de naphtaline ... si tu sais bien viser ... et à raison d'une boule par bestiole .
Tu peux également reprendre toutes les choses en mains à zéro (formatage), mais à condition de faire harakiri de tout ce qui, sur ta machine, est un exécutable et donc susceptible de "transmettre son savoir".
Attention : un classeur Excel peut par exemple et entre autres être en soi, avec ou sans macro, un tremplin insidieux (une "valise de transport", donc ...)
Amitiés et bon courage.
 

Staple1600

XLDnaute Barbatruc
Re

jmfmarques
Je m'inscris en faux. ;)
Mon PC n'est point infesté.
1) je navigue sans javascript, sans cookies, en mode "raw"
2) j'utilise les outils idoines relatifs à la sécurité d'un PC.
3) je ne laisse personne triturer mon registre
Bref j'estime être suffisamment "compétent" pour savoir que mon PC n'est pas vérolé.
Je dois juste me convaincre que c'est une daube!

M'en vais tester sur un XP virtualisé avec Excel 2003!
 

Staple1600

XLDnaute Barbatruc
Bonsoir mapomme

[mauvais esprit en désespoir de cause]
N'est-ce pas le cas des PC qui tourne sous Windows? ;)
Et pire sont ceux qui ont un proc AMD (Excel semble préférer Intel)
[/mauvais esprit en désespoir de cause]

Enfin si une âme charitable pouvait trouver une raison rationnelle à la chose.
(Parce j'ai beau chercher, c'est un W10* 64 bits bien sous tous rapports (sur lequel j'ai viré tous les bloatware que j'ai pu trouver)
(Upgrade:1903).
A part la suite Office, un brower et quelques logiciels OpenSource (en version portable), pas de programmes chelou installés.
Pas FaceBook, et consort, pas de wifi (que du filaire)
Bref, en théorie, je devrais avoir des résultats proches des autres intervenants du fil
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re à tous,

Ce code avec seulement un array et le tri Quicksort (pompé sur @BOISGONTIER ;) que je salue) me semble aussi très très rapide sinon plus.
VB:
Option Explicit

Const nb = 500000
Const frequence = 1

Sub test_Array()
ReDim t(1 To nb)
Dim max&, i&, n&, deb
    deb = Timer: max = nb / frequence
    For i = 1 To nb: t(i) = Int(Rnd * max): Next
    tri t, 1, nb
    n = 2
    For i = 2 To nb
        If t(i) <> t(n) Then n = n + 1: t(n) = t(i)
    Next i
    ReDim Preserve t(1 To n)
    MsgBox "Durée =  " & Format(Timer - deb, "0.00\ sec.") & vbLf & vbLf & _
    Format(nb, "#,##0") & " éléments au départ -> " & Format(UBound(t), "#,##0") & " sans doublon."
End Sub

Sub tri(a(), gauc&, droi&) ' Quick sort par BOISGONTIER
Dim ref&, g&, d&, temp&
   ref = a((gauc + droi) \ 2)
   g = gauc: d = droi
   Do
      Do While a(g) < ref: g = g + 1: Loop
      Do While ref < a(d): d = d - 1: Loop
        If g <= d Then
           temp = a(g): a(g) = a(d): a(d) = temp
           g = g + 1: d = d - 1
        End If
    Loop While g <= d
    If g < droi Then Call tri(a, g, droi)
    If gauc < d Then Call tri(a, gauc, d)
End Sub


Certains peuvent-ils le tester pour confirmer ou non ?
 

Pièces jointes

  • mapomme- version array- v1.xlsm
    18 KB · Affichages: 2

Staple1600

XLDnaute Barbatruc
Re

mapomme
Voila ce que j'obtiens avec mon PC pourrave ;)
Durée = 4,50 sec.
500 000 éléments au départ -> 318 957 sans doublon.

PS: je me suis permis de m'inclure dans les certains...

EDITION (2ième essai)
Durée = 4,22 sec.
500 000 éléments au départ -> 318 884 sans doublon.
(Avec Screen False et Calculation Manuel)
 

Discussions similaires

Statistiques des forums

Discussions
312 216
Messages
2 086 351
Membres
103 195
dernier inscrit
martel.jg