2012-05-14 8 views
35

Viele Menschen verwenden umfangreiche Arrays in Excel/VBA, um eine Liste von Daten zu speichern. Allerdings gibt es das Sammelobjekt, das meiner Ansicht nach VIEL VIEL bequemer ist (hauptsächlich: muss die Länge der Liste nicht neu definieren).Warum Arrays in VBA verwenden, wenn Sammlungen vorhanden sind?

Also, ich bin aufrichtig frage mich, ob ich etwas fehlt? Warum verwenden andere Leute immer noch Arrays, um eine Liste von Daten zu speichern? Ist es einfach ein Kater der Vergangenheit?

Antwort

31

Mehr Gründe Arrays anstelle von Sammlungen zu verwenden (oder Wörterbuch): mit Range("A1:B12") = MyArray

  • Sammlungen

    • Sie leicht Array übertragen (und umgekehrt) reichen nur einzigartige Schlüssel speichern können, während Arrays können einen beliebigen Wert speichern
    • Sammlungen ein paar zu speichern haben (Schlüssel, Wert), während Sie speichern können in einem Array unabhängig

    Chip Pearson's article über Arrays für ein besseres Verständnis Siehe

    Eine bessere Frage wäre eher, warum die Leute Sammlungen über Wörterbücher (ok, Sammlungen sind Standard VBA während Sie Wörterbücher Import haben) verwenden würde

  • +4

    Auch Arrays funktionieren besser als Auflistungen (mit Ausnahme von Schlüsselzugriff, wenn Sie nicht direkt in das Array indizieren können). –

    +0

    @CharlesWilliams: Danke für den Tipp – JMax

    +13

    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

    3

    Sammlungen, die automatisch skaliert werden, sind langsamer (theoretisch haben verschiedene Implementierungen natürlich ihre eigene Laufleistung). Wenn Sie wissen, dass Sie eine festgelegte Anzahl von Einträgen haben und Sie nur linear darauf zugreifen müssen, ist ein traditionelles Array der richtige Ansatz.

    15

    @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.

    Verwandte Themen