Dictionary-Object oder Collection
NoNet
Hallo Tanja,
Du könntest das Dictionary-Object "umgehen", indem Du eine Collection verwendest - siehe Beispiel hier :
https://www.herber.de/forum/archiv/1120to1124/t1122763.htm#1122772
Allerdings hast Du damit wohl weder etwas "gewonnen" noch "verloren" - es ist einfach nur eine andere Methode.
Allgemein formuliert könnte man diese beiden Objekte etwa so beschreiben :
Beide Objekte (Dictionary oder Collection) können Daten ähnlich wie ein ARRAY (das hat Beverly bereits erwähnt) speichern. Zu jedem Datensatz gibt es einen eindeutigen Schlüssel (Key, Index).
Über diesen Schlüssel wird ein Datensatz im Dictionary/Collection eindeutig identifiziert - das ist ähnlich wie eine eindeutige Nr. im Personalausweis oder Kundennr. in einem Vertrieb etc.
Der Code "klappert" nun alle Zeilen/Zellen einer Liste ab und versucht diese im Dic./Coll. zu speichern und vergibt als Schüssel den Inhalt/Wert der Zelle. Wenn der Wert noch nicht im Dic./Coll. vorhanden ist, klappt das auch problemlos, der Datensatz wird mit dem Schlüssel aufgenommen.
Wenn nun in der Liste doppelte Inhalte vorkommen, versucht der Code einen bereits vorhandenen Schlüssel erneut zu vergeben - und das ist nicht möglich : Daher wird der bereits vorhandene Datensatz nicht noch einmal gespeichert. Diese Schleife wiederholt sich bis zum Ende der Liste.
Als Resultat erhält man ein Dic./Coll.-Objekt, dass alle Daten ohne Redundanzen (also ohne doppelte Werte) enthält. Die doppelten/mehrfach enthaltenen Werte sind nun alle nur einmal im Dic./Coll. gespeichert.
Diese Methode ist gerade bei großen Listen wesentlich schneller als wenn man alle bereits gespeicherten Werte in einer zweiten Schleife erneut überprüfen würde.
Mein Rat : lehne dieses für Dich "NEUE OBJECT" nicht ab, sondern mache es dir zueigen indem du es verwendest und damit in Deinen Wissensschatz mit aufnimmst - "und wieder was gelernt..." ;-)
Gruß, NoNet
PS: EINE recht schnelle Möglichkeit kann ich noch dir zuguterletzt doch noch anbieten, um Dic./Coll. zu umgehen : Prüfung direkt in ARRAY-Variable ohne Schlüssel :
Private Sub UserForm_Activate()
Dim objARR()
Dim lngZ As Long
On Error Resume Next
ComboBox1.Clear 'Alte Inhalte löschen
ReDim objARR(0) 'ARRAY auf 0 Elemente vordefinieren
'Werte der Spalte A bis letzte gefüllte Zeile
For lngZ = 1 To Cells(Rows.Count, 1).End(xlUp).Row
'Prüfen mit VERGLEICH, ob Monats-Wert bereits in objARR enthalten ist :
If IsError(Application.Match(Format(Cells(lngZ, 1), "MMM YYYY"), objARR, 0)) Then
objARR(UBound(objARR)) = Format(Cells(lngZ, 1), "MMM YYYY")
ReDim Preserve objARR(UBound(objARR) + 1) 'Array um 1 Element erweitern
End If
Next
If UBound(objARR) > 0 Then ReDim Preserve objARR(UBound(objARR) - 1)
For lngZ = LBound(objARR) To UBound(objARR)
ComboBox1.AddItem objARR(lngZ)
Next
End Sub