Clever-Excel-Forum

Normale Version: Array in Collection
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo

bisher dachte ich, dass
- Objekte in Collections als Referenz gespeichert sind und nicht als Kopie (hab das wo gelesen),
- Arrays Obkjekte sind (hab ich auch wo gelesen).

Meine Hauptfrage:
Geht der Name eines Arrays beim Speichern in einer Collection verloren?

Nebenfrage:
Auf der Suche nach einer Antwort habe ich beim Probieren etwas Widersprüchliches entdeckt: 
Der Versuch, einen Eintrag eines Arrays zu ändern, das in einer Collection gespeichert ist, erzeugt keine Fehlermeldung (1), schlägt aber trotzdem fehl (2), .
Der Versuch, einen String-Eintrag in einer Collection zu ändern, führt zu einer Fehlermeldung (3).
(Die Zahlen in Klammer beziehen sich auf den folgenden Code)

Code:
Sub ArrayInCollection()
    Dim Feld, Sammlung As New Collection
    Dim Ergebnis
   
    Feld = Array("Hund", "Katze", "Pferd")
    Sammlung.Add Feld
    Sammlung.Add "London"
    Sammlung(1)(1) = 45         '(1)
   
    'Ergebnis="London" und nicht 45
    Ergebnis = Sammlung(1)(0)   '(2)
   
    'Jetzt kommt Fehlermeldung
    Sammlung(2) = 11            '(3)
   
End Sub


Gruß, Raoul
Hallo Roul,

zu Hauptfrage und bisheriger Ansicht:
Du kannst ja einmal folgendes Makro schrittweise durchlaufen lassen und im Fenster "Lokal" die Inhalte der Variblen verfolgen.
Code:
Sub ArrayInCollection()
    Dim Feld, Sammlung As New Collection
    Dim Ergebnis
  
    Feld = Array("Hund", "Katze", "Pferd")
    Sammlung.Add Feld
    Sammlung.Add "London"
    Sammlung(1)(1) = 45         '(1)
  
    'Ergebnis="London" und nicht 45
    Ergebnis = Sammlung(1)(1)   '(2)
   
    Feld(1) = 45
    Ergebnis = Sammlung(1)(1)
  
End Sub



zur Nebenfrage:
In beiden Fällen können die Einträge der Collection nicht geändert werden. e s besteht nur die Möglichkeit den Eintrag zu
löschen und an gleicher Stelle einzufügen.
Siehe auch in http://www.vba-wiki.net/index.php?title=Collection


Zitat:Wert überschreiben

Wenn ein Element einer Collection hinzugefügt wurde, kann man es nicht nachträglich ändern, denn die 'Item'-Eigenschaft ist schreibgeschützt.
danke für Deine Antwort, Helmut.

meine Hauptfrage muss ich etwas ergänzen:
Geht der Name eines Arrays beim Speichern in einer Collection verloren? Ich vermute ja, denn ich habe keinen gegenteiligen Hinweis gefunden. Deshalb frage ich hier, ob mir das jemand bestätigen kann.

Dein Makro zeigt offensichtlich, dass in der Collection eine Kopie des Arrays, und keine Referenz auf dieses abgelegt ist.

Zur Nebenfrage:
Ich sehe, Du verstehst, was ich meine. In beiden Fällen können die Einträge der Collection nicht geändert werden. Im Fall der Zuweisung des Array-Objekts geht das Makro einfach weiter und im anderen Fall kommt die Fehlermeldung: "Objekt erforderlich". Das ist doch seltsam, oder?

Gruß, Raoul
Hallöchen,

ja, aber Du könntest bei unterschiedlichen / eindeutigen Arrays einer Collection den Namen als Key speichern.
Der Name des Array ist eventuell zuweilen in so fern irrelevant, da Du in der Collection verschiedene Zustände eines Array speichern könntest, wobei es natürlich auch 4 Zustände von arrTemp1 sein könnten, 2 von arrTemp2 und 6 von arrTemp3, dann wären die keys nicht ohne weitere Angaben verwendbar. Aber man könnte ja auch Collections schachteln oder … oder ...
Die verschiedenen Zustände tangieren dann auch die Klassenprogrammierung, wo Du in der Collection mehrere der von einer Klasse z.B. erzeugten Arrays hinterlegen kannst.

Im Prinzip mal für die zeilenweise Übernahme von Zellinhalten aus A1:C3

Code:
Sub test1()
Dim colDaten As New Collection
For icnt = 1 To 3
  arrTemp = Cells(icnt, 1).Resize(1, 3).Value
  colDaten.Add arrTemp
Next
End Sub

oder

Code:
Sub test2()
Dim colDaten As New Collection
arrTemp1 = Cells(1, 1).Resize(1, 3).Value
arrTemp2 = Cells(2, 1).Resize(1, 3).Value
arrTemp3 = Cells(3, 1).Resize(1, 3).Value
colDaten.Add arrTemp1, "arrTemp1"
colDaten.Add arrTemp2, "arrTemp2"
colDaten.Add arrTemp3, "arrTemp3"
a = colDaten("arrTemp3")
End Sub
hallo André aus G in T

das erste Wort Deines Beitrags nach der Begrüßung: "Ja"

Falls das die Antwort auf meine Hauptfrage ist: Danke. jaetzt bin ich ausreichend sicher, dass in der Collection eien Kopie abgelegt wird. 

Ja, genau für solche Einsätze, wie Du in Deinem ersten Code-Beispiel zeigst, will ich Arrays in Collections einsetzen. Vielen Dank.

Falls das die Antwort auf meine Nebenfrage, ob das nicht seltsam sei, ist:

Dann stellt sich die Frage, aus welchem Grund Excel in einem Fall einfach weiter geht*) und im anderen Fall eine Fehlermeldung macht. Aber das habe ich ja scho gestellt. 

*) Auf die Fehlerwarnung ist kein Verlass mehr. 

Vielleicht kannst Du das freundlicherweise beantworten.

Gruß, Raoul
Hallöchen,
Mal vom Smartphone aus zur Fehlermeldung. Die kommt sicher weil Du nur zwei hinzu gefügt hast und mit (2) den dritten Item abfragst.
Nein, die Colletion nummeriert ab 1.

Die Fehlermeldung "Objekt erforderlich" kommt deshalb, weil versucht wird, einen Eintrag in der Collection zu verändern, was aber laut Beschreibung nicht geht.

Aber das ist nur meine Vermutung. Vielleicht gibt es einen anderen Umstand, der diese Fehlermeldung auslöst.
Hallöchen,

Zitat:die Colletion nummeriert ab 1.
ok, hab ich am Handy nicht gesehn  :21:
Hast mich aber auch etwas auf den Holzweg gebracht Smile :

Zitat:    Sammlung(1)(1) = 45        '(1)
    'Ergebnis="London" und nicht 45
    Ergebnis = Sammlung(1)(0)  '(2)

(1)(0) ist dann bei mir der Hund und nicht London. London ist dann die Sammlung(2) Was aber der Frage keinen Abbruch tut ...

Dass eine Änderung nicht geht ist auch korrekt, nur dass keine Fehlermeldung kommt seitens MS nicht. Und auch der Text der Fehlermeldung ist nicht unbedingt das, was ich mir wünschen würde Sad
Ja, mein Fehler. Kann ihn nicht mehr reparieren.

Aber richtigstellen:


Code:
Sub ArrayInCollection()
    Dim Feld, Sammlung As New Collection
    Dim Ergebnis
  
    Feld = Array("Hund", "Katze", "Pferd")
    Sammlung.Add Feld
    Sammlung.Add "London"
    Sammlung(1)(1) = 45         '(1): keine Fehlermeldung, aber auch keine Änderung
  
    'Ergebnis="Hund" und nicht 45
    Ergebnis = Sammlung(1)(0)   '(2): Änderung von (1) ist nicht erfolgt
  
    'Jetzt kommt Fehlermeldung
    Sammlung(2) = 11            '(3): Laufzeitfehler424, "Objekt erforderlich"
  
End Sub


Sorry für den Holzweg.



Die Frage ist weiterhin noch offen für aaallllleeeeeee ...



Gruß, Raoul