@CharlesWilliams Antwort ist korrekt: das Durchlaufen aller Werte eines Arrays ist schneller als das Iterieren einer Collection oder eines Dictionary: so sehr, dass ich immer die Keys() - oder Items() -Methode eines Dictionarys verwende, wenn ich dies tun muss - beide Methoden kehren zurück ein Vektor-Array.
Ein Hinweis: Ich benutze die Dictionary-Klasse weit mehr als ich Sammlungen verwende, die Exists() -Methode ist einfach zu nützlich.
Es gibt natürlich auch Nachteile für Sammlungen und Wörterbücher. Eine davon ist, dass Arrays 2- oder sogar 3-dimensional sein können - eine viel bessere Datenstruktur für tabellierte Daten. Sie können Arrays als Mitglieder einer Sammlung speichern, aber es gibt einige Nachteile: Einer von ihnen ist, dass Sie möglicherweise keinen Verweis auf das Element bekommen - es sei denn, Sie arrItem = MyDictionary(strKey)
verwenden, werden Sie fast sicher eine "ByVal" Kopie von erhalten das Array; Das ist schlecht, wenn Ihre Daten dynamisch sind und Änderungen durch mehrere Prozesse unterliegen. Es ist auch langsam: viel Zuteilung und Freigabe.
Am schlimmsten ist, dass ich VBA nicht wirklich traue, den Speicher freizugeben, wenn ich eine Sammlung oder ein Wörterbuch mit Arrays (oder Objekten!) Als Members habe: nicht out-of-scope, nicht von Set objCollection = Nothing
, nicht einmal von objDictionary.RemoveAll - es ist schwierig zu beweisen, dass das Problem mit dem begrenzten Test-Toolkit in der VBE existiert, aber ich habe genügend Speicherlecks in Anwendungen gesehen, die Arrays in Wörterbüchern verwendeten, um zu wissen, dass Sie vorsichtig sein müssen. Davon abgesehen verwende ich niemals ein Array ohne einen Erase-Befehl.
@JMax hat das andere große Plus für Arrays erklärt: Sie können ein Array in einem einzigen "Treffer" zum Arbeitsblatt auffüllen und Ihre Arbeit in einem einzigen Treffer schreiben.
Sie können natürlich das Beste aus beiden Welten erzielen, indem Sie eine Indexed-Array-Klasse erstellen: ein zweidimensionales Array mit zugehörigen Auflistungs- oder Wörterbuchobjekten, die eine Art Zeilenidentifikation als Schlüssel speichern, und die Zeilen-Ordinalzahlen als Datenelemente.
Auch Arrays funktionieren besser als Auflistungen (mit Ausnahme von Schlüsselzugriff, wenn Sie nicht direkt in das Array indizieren können). –
@CharlesWilliams: Danke für den Tipp – JMax
Sammlungen müssen nicht einen Schlüssel speichern, es ist optional. Sammlungen können auch einen beliebigen Wert speichern, nur die Schlüssel (wenn Sie sie verwenden) müssen eindeutig sein. – Cutter