Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Array in Collection
#1
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
Antworten Top
#2
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.
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





Antworten Top
#3
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
Antworten Top
#4
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
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#5
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
Antworten Top
#6
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.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#7
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.
Antworten Top
#8
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
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#9
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
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste