Collection webpagina

  • Onderwerp starter Onderwerp starter snb
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.
SNB,

Goed stuk erg verhelderend.
Ik gebruik zelf een collectie alleen als ik een unieke lijst wil maken. Aangezien een collectie geen dubbele sleutels
accepteert kun je dit samen met een foutafhandeling gebruiken om alle dubbele gegevens uit een lijst te verwijderen.

Dank voor je werk.
 
@elsendoorn,

Dankjewel.

Voor een unieke lijst gebruik ik zelf liever de Dictionary, omdat je daarin geen foutafhandeling hoeft op te nemen.
 
Thanks snb, weer een mooi stukje naslagwerk.

2.1 Methode Dim
Met de methode Dim kun je in 1 keer zowel de variabele declareren als een Collection aanmaken:
Dim c_00 as New Collection

Volgens mij wordt in dit geval (auto-instancing) enkel het object/de collectie gedeclareerd en pas bij de eerste aanroep van c_00 in de code wordt de Collection echt aangemaakt
 
Volgens mij wordt in dit geval (auto-instancing) enkel het object/de collectie gedeclareerd en pas bij de eerste aanroep van c_00 in de code wordt de Collection echt aangemaakt

Code:
   Dim c_00 As New Collection
   MsgBox VarType(c_00) & vbTab & TypeName(c_00)

Ik zou niet weten hoe ik er achter zou moeten komen wanneer een Collection (in jouw formulering) 'echt' is aangemaakt, en wat daarvan het effekt is voor het gebruik van de code. Heb je een suggestie ?
 
Zoals Eric al aangeeft wordt bij auto-instancing het object aangemaakt bij eerste aanroep van de variabele. Een nadeel hiervan is dat dan niet getest kan worden op nothing.
'Debug.Print c_00 Is Nothing' geeft dan altijd onwaar, omdat alleen al de aanroep van c_00 ervoor zorgt dat de collection wordt aangemaakt.
 
@rebmog

Dank, maar waarom/wanneer zou je willen testen op 'Nothing' ?
 
Er zijn denk ik veel situaties denkbaar waar het checken op nothing op zich van pas kan komen, maar die situaties kunnen natuurlijk ook op een andere manier geprogrammeerd worden. Ik heb het zelf bijvoorbeeld wel eens gebruikt om nieuw toegevoegde gegevens uit een dumpbestand als objecten in te lezen in een dictionary. Een simpele check op het bestaan van deze dictionary kan de volstaan om te kijken of er nieuwe objecten zijn gevonden (If Not oDic is Nothing). Bij auto instancing is dat dus niet mogelijk.

Een ander nadeel(tje) van auto instancing is dat bij elke aanroep van de betreffende variabele telkens op de achtergrond wordt gecontroleerd of de het object al is aangemaakt. Dus bij elke aanroep wordt als het ware het volgende loopje doorlopen:
Code:
If c_00 Is Nothing Then Set c_00 = New Collection
In principe werkt dat iets vertragend, maar in de praktijk leidt dat niet tot meetbare snelheidsverschillen.

Een ander punt van aandacht bij auto instancing is dat je bij het aanmaken van meerdere objecten van hetzelfde type in een loop telkens aan het einde van de loop de variabele op nothing moet zetten om een nieuw object te krijgen.

Al met al gebruik ik zelf daarom vrijwel nooit auto instancing, omdat ik liever zelf expliciet bepaal wanneer een object aangemaakt moet worden.
 
@Rebmog

Dank voor je uitgebreide toelichting.

Ik moet zeggen: ik zie het niet.

Een simpele check op het bestaan van deze dictionary (Collection snb) kan volstaan om te kijken of er nieuwe objecten zijn gevonden (If Not oDic is Nothing). Bij auto instancing is dat dus niet mogelijk.
1. If c_00.count=0 then geeft, lijkt mij, voldoende informatie.

In principe werkt dat iets vertragend, maar in de praktijk leidt dat niet tot meetbare snelheidsverschillen.
2. Iedere niet waarneembare 'vertraging' vind ik niet relevant. De website is voor VBA-gebruikers, niet voor techneuten.

Een ander punt van aandacht bij auto instancing is dat je bij het aanmaken van meerdere objecten van hetzelfde type in een loop telkens aan het einde van de loop de variabele op nothing moet zetten om een nieuw object te krijgen.
3. Dat lijkt me evenveel werk als het herhaaldelijk gebruik van Dim c_00 as new Collection

Fijn dat je inhoudelijk op mijn vragen bent ingegaan.
Ik hoop dat mijn antwoorden niet de indruk geven dat ik ze niet op prijs stel. Ik beschouw echter de overwegingen te ver van de betekenis voor de doelgroep van mijn verhaal/site liggen om ze op te nemen. Ik beschouw ze als 'technicalities' die aan de functionaliteit van de verschiillende opties niets afdoen.

Terzijde (want niet in reaktie op jouw informatie) ben ik tot het inzicht gekomen, zoals ook bij anderen op Internet te lezen, dat een Collection geen voordelen biedt ten opzichte van een Dictionary. Die biedt veel meer.
 
Ook bij If c_00.count=0 then wordt de collectie pas aangemaakt (want eerste aanroep)

Mijn reaktie in post#4 had meer met het tekstuele te maken; pas bij eerste aanroep wordt de collectie aangemaakt en niet bij Dim c_00 as New Collection
(kijk maar in je 'locals'window)

@Rebmog, thanks voor de toelichting

edit:
Code:
Sub tst()
Dim c_00 As New Collection
Dim c_01 As Collection
Set c_01 = New Collection

    Debug.Print VarType(c_00) & vbTab & TypeName(c_00)
    Set c_00 = Nothing
    For Each it In c_00 'bij aanroep wordt c_00 (weer) aangemaakt
        Debug.Print it
    Next
    
    Debug.Print VarType(c_01) & vbTab & TypeName(c_01)
    Set c_01 = Nothing
    For Each it In c_01
        Debug.Print it 'errors want c_01 is niks en blijft niks
    Next
    
End Sub
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan