Registriert seit: 01.04.2020
Version(en): 2007
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
Registriert seit: 21.06.2016
Version(en): 2021
30.05.2020, 22:38
(Dieser Beitrag wurde zuletzt bearbeitet: 30.05.2020, 22:39 von Ego.)
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=CollectionZitat: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.
Registriert seit: 01.04.2020
Version(en): 2007
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
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
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)
Registriert seit: 01.04.2020
Version(en): 2007
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
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
31.05.2020, 22:29
(Dieser Beitrag wurde zuletzt bearbeitet: 31.05.2020, 22:30 von schauan.)
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)
Registriert seit: 01.04.2020
Version(en): 2007
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.
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
01.06.2020, 04:49
(Dieser Beitrag wurde zuletzt bearbeitet: 01.06.2020, 04:49 von schauan.)
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 : 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
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 01.04.2020
Version(en): 2007
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
|