Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1896to1900
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Grundsatzfrage Deklaration Array+Filter

Grundsatzfrage Deklaration Array+Filter
26.08.2022 13:05:42
Pebe
Guten Tag ins Forum
Ich verstehe ein paar Dinge nicht (auch nicht nach Google- und Hilfe-Recherche) bei der Anwendung eines Arrays, das eine variable Anzahl von Zeilen erfassen soll. Anbei ist eine kleine Beispiel-Datei mit insgesamt 10 Zeilen in 2 Subs.
https://www.herber.de/bbs/user/154825.xlsm
Frage zu Sub Statisch():
Warum ist bei Dim strNamen eine doppelte Klammer hintendran und bei Dim strFiltermenge nicht? Füge ich dort auch eine Doppelklammer an, entsteht bei der Ausführung eine Fehlermeldung 'Laufzeitfehler 13 - Typen unverträglich'.
Frage zu Sub Dynamisch():
Warum entsteht hier bei strNamen ein mehrdimensionales Array und nicht wie bei Sub Statisch() ein eindimensionales? Deshalb funktioniert natürlich auch der Filter nicht.
Danke für eure Unterstützung
Pebe

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Grundsatzfrage Deklaration Array+Filter
26.08.2022 14:12:31
Marc
Da sind einige Probleme zum Verständnis von VBA Arrays...
Variant ist kein automatisches Erstellen von Array
du kannst z.b. auch ein Array erstellen mit
Dim MeinArray (10) as Integer
(damit erstellst du ein Array mit 10 Werten die aber alle Integer sein müssen), das geht auch mit anderen Datentypen
Das Variant hat einen größeren Speicherbereich....
Du kannst nicht die Größe eines Arrays einfach so ändern, dazu brauchst du ReDim
Bedeutet wenn du in einem Array einen neuen Wert einfügen willst, musst du vorher mit ReDim Preserve das Array erweitern, erst dann den neuen Wert einpflegen. Dabei musst du drauf achten, das du natürlich dem Array auch sagst, an welcher Stelle er den Wert speichern soll (das machst du in deinen Subs nicht)..
In Statisch:

strNamen() = Array("Bob Smith", "John Davies", "Fred Jones", "Steve Jenkins", "Bob Williams", "Bob Horst")
Korrekte Zuweisung, denn denn dem strNamen() wird nacheinander ein Wert zugeordnet... die du dann mit strNamen(0) etc. aufrufen kannst..

strFiltermenge = Filter(strNamen, "Bob")
falsch
1. ist das Array mit keiner bestimmten Größe initialisiert worden
2. wird nicht ein bestimmtest Element angesprochen
3. Es findet kein ReDim statt
Arrays die automatisiert eine Größe errechnet bekommen , haben immer 2 Dimensionen....

StellenPlanArray = Sheets("Stellenplan").Range("A1:BZ" & letzteZeile)
' zurgriff mit :
StellenPlanArray((i + 1), (PointerJahr + Monat))
Liegt daran, das VBA deine Initialisierung als Range-Objekt betrachtet...
Schau mal hier, da ist es ganz gut erklärt..
https://docs.microsoft.com/de-de/office/vba/language/concepts/getting-started/declaring-arrays
https://www.automateexcel.com/de/vba/deklarieren-erstellen-initialisieren-array-variablen/#:~:text=Eine%20VBA-Array-Variable%20kann%20man%20sich%20als%20eine%20Gruppe,Ein%20Array%20kann%20Text%2C%20Zahlen%20oder%20Objekte%20speichern.
Anzeige
AW: Grundsatzfrage Deklaration Array+Filter
26.08.2022 14:48:33
Pebe
Danke, Marc für deine Ausführungen, die ich kenne, weil ich z. B. das in docs.microsoft... und automateexcel... bereits gelesen habe.
Neu für mich war deine informative Anmerkung, dass Arrays mit automatischer Grössenordnung grundsätzlich zweidimensional sind. Das beantwortet einen Teil meiner Frage. Ich werde es ausprobieren und damit verifizieren.
Offen bleibt für mich dann meine Frage, warum in Sub Statisch() bei Dim strFiltermenge keine Klammer hintendran ist. Ich möchte aufgrund deiner Antwort meine Frage dazu präzisieren:
(1) Ist die Deklaration mit Klammer ein Array?
(2) Ist die Deklaration ohne Klammer kein Array, sondern einfach eine Variable, die Variant ist und kann aber ein Array werden, je nachdem, wie sie befüllt wird?
Vielleicht kommen ja noch andere Antworten rein, was ich sehr schätzen würde.
Guten Nachmittag allerseits,
Pebe
Anzeige
AW: Grundsatzfrage Deklaration Array+Filter
26.08.2022 15:10:59
Daniel
"Arrays die automatisiert eine Größe errechnet bekommen , haben immer 2 Dimensionen"
Das stimmt so nicht. Besser wäre:
"Arrays, die aus einem Zellbereich übernimmen werden, sind immer 2-Dimensional, sobald der Zellbereich mehr als eine Zelle umfasst, auch wenn der Bereich nur eine Zeile hoch oder eine Spalte breit ist."
Bei x = split("a b c d e", " ") wird auch automatisiert eine Dimension berechnet, ist aber eindimensional.
Gruß Daniel
AW: Grundsatzfrage Deklaration Array+Filter
27.08.2022 14:31:58
Marc
Danke für die Präzesierung...
Ich hatte es mit dem Nebensatz
er sieht eine range automatisch als 2 Dimensional an, angedeutet.
AW: Grundsatzfrage Deklaration Array+Filter
27.08.2022 14:36:26
Marc
Eine Deklaration eines Variant ohne () ist kein definiertes Array
soll sich das ändern müsste es mit ReDim geändert werden (wobei ich da testen muss ob das geht, wenn dem Variant schon was zugeordnet ist)
Anzeige
AW: Grundsatzfrage Deklaration Array+Filter
27.08.2022 19:29:55
Daniel
Hi
Nach Dim x kannst du an x alles anhängen, Einzelwerte, Objekt, Array
Arrays kannst du entweder als ganzes zuweisen oder nach Redimensionierung auf eine bestimmte Größe auch die Einzelstellen des Arrays füllen.
Nach Dim x() kannst du nur noch Arrays anhängen oder redimensionieren, aber keine Einzelwerte oder Objekte mehr zuweisen.
Alles was du bei DIM angibst, gilt unveränderlich im ganzen Makro.
Alles was du offen lässt, kannst du mit ReDim nachträglich ändern.
Aufpassen muss man hier (x als Variante):
bei x = Range("A1").Value wird x eine normale Einzelwertvariable
bei x = Range("A1:A2").Value wird x ein Array.
Hat man also einen variablen Zellbereich, der auch mal nur eine Zelle umfassen kann, muss man das Abfragen und differenziert programmieren.
Hier mal ein Beispiel, wie man in beiden Fällen ein Array bekommt; damit man einheitlich weiterarbeiten kann:

Dim x
Dim rng as Range
Set rng = ... Berechneter Zellbereich ...
If rng.cells.count = 1 then
Redim x(1 to 1, 1 to 1)
x(1, 1) = rng.value
Else
x = rng.value
End if 
Damit ist x immer ein Array, auch bei einem einzelligen Zellbereich und du kannst den Rest einheitlich für Array programmieren.
Gruß Daniel
Anzeige
AW: Grundsatzfrage Deklaration Array+Filter
29.08.2022 21:00:47
Pebe
Vielmals Danke für die Erklärungen. Aus allen Beiträgen konnte ich mir die Essenz rausziehen.
Danke, Marc für die Antwort mit der Klammer, dass es ohne Klammer dann kein Array ist.
Danke, Daniel für den Hinweis mit der Einzelwertvariablen und gleich der Abhilfe.
Ich brauchte das für einen Weg aus einem 2dimensionalen Array ein 1dimensionales zu machen und dieses dann direkt zu filtern. Obwohl es nur am Rande etwas mit meinem Thread zu tun hat, stelle ich es hier rein, um meinen Erkenntnisgewinn zu teilen - herzlichen Dank.
https://www.herber.de/bbs/user/154866.xlsm
Anzeige
AW: Grundsatzfrage Deklaration Array+Filter
29.08.2022 21:28:53
Daniel
Wenn man ein zweidimensionales Array mit einer Spalte und vielen Zeilen transponiert (Worksheetfunction.Transpose(x)) ist VBA in der Lage, das Ergebnis je nach Bedarf als zweidimensionales Array mit einer Zeile zu interpretieren, aber auch als eindimensionales Array.
Echte zweidimensionale Arrays mit einer Zeile und vielen Spalten müssen zweimal transponiert werden.
Alternativ erstellt man ein neues Array und überträgt die Werte einzeln per Schleife.
In älteren VBA-Versionen war das auch die bessere Methode für große Arrays, weil schneller und nicht limitiert in der Array-Größe wie Transpose.
Gruß Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige