Fragen zu Dictionary

20/06/2008 - 18:52 von Eberhard Funke | Report spam
Hallo,

A1:A10 Namen, die auch mehrfach vorkommen. Ähnlich
Spezialfilter/ohne_Dubletten sollen die vorkommenden Namen herausgefiltert
werden.

Sub Test_Dictionary()
Dim lngI As Long
Dim objDic
Dim Temp

Set objDic = CreateObject("Scripting.Dictionary")
For lngI = 1 To 10
If Not objDic.exists(Range("A" & lngI)) Then
objDic.Add Range("A" & lngI), Range("A" & lngI)
End If
Next
For Each Temp In objDic.Keys 'Items
Debug.Print Temp
Next
End Sub

Ausgegeben werden aber *alle* A1:A10.
Wo liegt der Fehler?

Wie kann ich gezielt aus objDic.Keys (bzw. Items) einzelne Keys (Items)
abfragen (etwa so: objDic.keys(1))?

(Auf Microsoft.Scripting.Runtime ist ein Verweis gesetzt.)

Mit freundlichen Grüssen Eberhard
XP home XL 2000
Eberhard(punkt)W(punkt)Funke(at)t-online.de
 

Lesen sie die antworten

#1 Peter Schleif
20/06/2008 - 19:35 | Warnen spam
Eberhard Funke schrieb am 20.06.2008 18:52 Uhr:
Hallo,

Ausgegeben werden aber *alle* A1:A10.
Wo liegt der Fehler?



Hallo Eberhard.

Vermutlich erwartest Du hier:

If Not objDic.exists(Range("A" & lngI)) Then

dass Range den *Inhalt* der Zelle A1:A10 liefert. Normalerweise ist
das auch so, weil .Value die default-Eigenschaft des Range-Objektes
ist. Dictionary kennt diese default-Vereinbarung von Excel aber nicht
und interpretiert deshalb jede Zelle als eigenstàndiges Objekt, dass
sich somit von allen anderen Zellen unterscheidet - trotz gleichen
Inhalts.

Du kannst das leicht überprüfen, wenn Du Range.Value verwendest statt
Range. Dann macht dein Code, was Du erwartest. Zur Unterscheidung
zwischen Key/Item habe ich außerdem .Addresse benutzt. Wegen deiner
zweiten Frage (siehe unten)

If Not objDic.exists(Range("A" & lngI).Value) Then
objDic.Add Range("A" & lngI).Value, Range("A" & lngI).Address
End If


Wie kann ich gezielt aus objDic.Keys (bzw. Items) einzelne Keys (Items)
abfragen (etwa so: objDic.keys(1))?



Deine Schleife liefert schon die Keys. Die eigentlichen Items bekommst
Du über Indizierung mit eben diesen Keys:

For Each Temp In objDic
Debug.Print Temp, objDic(Temp)
Next

Peter

Ähnliche fragen