• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

is een "Scripting.Dictionary" intern geindexeerd ???

Status
Niet open voor verdere reacties.

sylvester-ponte

Verenigingslid
Lid geworden
19 apr 2007
Berichten
6.620
hallo,
weet iemand of een Dictionary in excel (vba) automaties geindexeerd wordt?

dit om snelheid te winnen bij grote data hoeveelheden

om dit zelf te doen is de methode before en after nodig maar die heb ik niet gevonden in de helpfile.

in een collection zit de methode before en after wel

dit maakt de interne zoek opdrachten veel sneller

groet sylvester
 
hallo snb

als ik een dictionary vul met duizenden key's met items
wil ik graag dat steeds de nieuwe key zodanig wordt geplaats dat alle items op "volgorde staan".
bv van hoog naar laag van de item_waarde. dus niet op volgorde van invoeren.
als ik dan later alle items opvraag staan ze gelijk op volgorde.

als dit kan vind ik het al heel mooi.
want: als ik een gesorteerde lijst heb dan kan er binair gezocht worden op waarden in de items.
dat gaat veel sneller dan steeds een voor een zoeken.

wat ik ook wil weten is als ik een item via zijn key zoek of de dictionary alle keys een voor een gaat afzoeken tot hij gevonden is (zo zoekt de find in vba ook) . dat kan behoorlij vertragen bij grote bestanden. (binair zoeken in een gesorteerde reeks gaat zeer veel sneller).


groet sylvester
 
(1) De dictionary voegt items ongesorteerd toe (is eenvoudig na te gaan in het locals venster). Als je ze gesorteerd wilt hebben zul je dat zelf moeten doen.
(2) De dictionary kent de Exists methode. Ongetwijfeld zal het object hiervoor intern een index opbouwen en binair zoeken.

Ik hoop dat dit helpt.
 
Ik ben bang dat de zoeksnelheid teniet wordt gedaan door de sorteersnelheid (ook die van een collection).
 
Kun je geen gebruik maken van een hashtable? volgens mij zijn die juist gemaakt om keys te indexeren? of wil je het juist andersom?
 
@Wher

Kun je dan ook vertellen welke referentie je daarvoor moet activeren ?

Met late koppeling kan het met
With CreateObject("system.collections.sortedlist")
of
With CreateObject("system.collections.arraylist")
 
hoe krijg ik System.Collections.ArrayList aan de praat?

en als het bij mij werkt hoe krijg ik het dan bij een ander aan de praat? of gaat dat vanzelf als ik mijn programma opstuur?
 
Late binding werkt in principe altijd, zolang de ontvanger maar .net geïnstalleerd heeft.

Overigens is "dictionary" volgens microsoft wel lineair bij het opzoeken van waarden, maar niet per se gesorteerd.
 
De referentie voor zowel de arraylist als de sortedlist is mscorlib.

Daarna kun je het volgende gebruiken
Code:
With new arraylist
  .add
end with

if

Code:
With new sortedlist
  .add
end with
 
Code:
Dim a As New arraylist
is early binding en is de nette manier die alleen werkt als je juiste referenties hebt ingeschakeld, je hebt het voordeel bij het programmeren dat autoaanvullen werkt, en misschien ook de help
als andere gebruikers de referenties niet hebben ingesteld loopt de code vast

Code:
Set b = CreateObject("system.collections.arraylist")
is late binding is de minder nette manier die bijna altijd werkt, je hebt niet het voordeel bij het programmeren dat autoaanvullen werkt

zoek maar eens op early binding late binding

persoonlijk gebruik ik op het forum late binding, hiermee voorkom ik al de helft van de vragen van het werkt niet (omdat de gebruiker niet de referenties heeft ingesteld)

p.s. ik ben autodidact en geen purist
 
Laatst bewerkt:
Intellisense werkt niet bij mscorlib evenmin als de 'hulp' of de 'objectbrowser'.
 
Ben nog even gedoken in de suggestie van Wher. De sortedlist lijkt een goede aanvulling op collection en dictionary. Hier en daar wel wat weerbarstig. Thx Wher. :thumb:

Code:
Option Explicit

Sub test()
    
    Dim mySL As Object
    Set mySL = CreateObject("system.collections.sortedlist")
    
    Dim myKey As Long ' double, string, date, variant, udt, ...
    Dim i As Long
    
    ' add unsorted items. note: strong type checking
    With mySL
        myKey = 1000:   .Add myKey, myKey ' long
        myKey = 10:     .Add myKey, "ten" ' string
        myKey = 9:      .Add myKey, 9 ' integer
        myKey = 100:    .Add myKey, myKey
        myKey = 1:      .Add myKey, myKey
        myKey = 99:     .Add myKey, myKey
    End With
    
    ' check existance before insert
    myKey = 98
    If mySL.ContainsKey(myKey) Then Debug.Print myKey & " no show" Else mySL.Add myKey, myKey
    If mySL.ContainsKey(myKey) Then Debug.Print myKey & " exists " Else mySL.Add myKey, myKey

    ' update by index
    For i = 0 To mySL.Count - 1
        If VarType(mySL.GetByIndex(i)) = vbLong Then
            ' mySL.GetByIndex(i) = mySL.GetByIndex(i) * 10 ' throws exception
            myKey = mySL.GetKey(i)
            mySL(myKey) = mySL(myKey) * 10
        End If
    Next i
    
'    ' update by entry: no go?
'    Dim objEntry As Object ' objEntry must be of type DictionaryEntry
'    For Each objEntry In mySL
'        If VarType(objEntry) = vbLong Then objEntry = objEntry * 10
'    Next objEntry
    
    ' update by key
    myKey = 98
    mySL(myKey) = CLng(1000) ' convert int to lng
    mySL(myKey + 1) = CLng(1000)
    
    ' list all
    For i = 0 To mySL.Count - 1
        Debug.Print i, mySL.GetKey(i), mySL.GetByIndex(i), VarType(mySL.GetKey(i)), VarType(mySL.GetByIndex(i))
    Next i
        
    ' get first occurence of value
    Debug.Print
    i = mySL.IndexOfValue(CLng(1000))
    Debug.Print i, mySL.GetKey(i), mySL.GetByIndex(i)
    i = i + 1
    Debug.Print i, mySL.GetKey(i), mySL.GetByIndex(i)
    
    ' remove all
    For i = 0 To mySL.Count - 1
        mySL.RemoveAt 0
    Next i
    Set mySL = Nothing
    
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan