Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1808to1812
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

Array wird falsch aufgebaut

Array wird falsch aufgebaut
02.02.2021 15:02:53
Kay
Hallo,
normalerweise funktioniert das Einlesen von Bereichen in Excel in ein Array in VBA problemlos.
In Excel
MeinBereich = A1:D9
In VBA
Dim MeinArray
MeinArray= MeinBereich
Somit erhalte ich ein zweidimensionales Array, dass 9 Zeilen (1.Dimension) und 4 Spalten (2.Dimension) hat, welches ich mit MeinArray(Zeile, Spalte) dann ansprechen kann.
Nun mein Problem. Da ich nicht genau weiß, wie viele Zeile und Spalten es in MeinBereich gesetzt sind, kommt es bei folgender Konstellation zu Problemen:
In Excel
MeinBereich = A1:D1
In VBA
Dim MeinArray
MeinArray= MeinBereich
Somit erhalte ich ein eindimensionales Array, dass 4 "Spalten" nun in Zeilen (1. Dimension) angelegt.
Jetzt habe ich kein 2 dimensionales Array mehr, sondern auf Grund des einzeiligen Bereichs in Excel werden alle Spalten in der ersten Dimension abgebildet.
Ich wollte aber in diesem Fall ein 2 dimensionales Array, wobei die erste Dimension nur eine Eintrag hat.
Es sollen die Excel Spalten auch immer in der 2. Dimension eingelesen werden.
Wie muss man das Array dimensionieren, das es immer 2 dimensional ist und dynamisch auf Anzahl der Zeilen sowie Spalten aus dem zu übernehmenden Bereich ausgelegt wird.
Danke und Gruß
Kay

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Nimm mindestens 2 Zeilen und redimensioniere
02.02.2021 15:12:05
lupo1
AW: Array wird falsch aufgebaut
02.02.2021 15:16:04
Nepumuk
Hallo Kay,
nicht nachvollziehbar. Wenn ich:
Public Sub Test()
    Dim x As Variant
    x = Worksheets("Tabelle1").Range("A1:D1").Value
End Sub

mit F8 durchsteppe, bekomme ich ein Array mit den Dimensionen 1 To 1, 1 To 4 also ganz klar zwei Dimensionen. Im Lokalfenster sieht das so aus:
+ : x : : Variant/Variant(1 to 1, 1 to 4)
Gruß
Nepumuk
Anzeige
AW: Array wird falsch aufgebaut
02.02.2021 15:37:38
Kay
Da ich MeinBereich durch Filter zuweise, sieht es bei mir so aus:
MeinArray = Evaluate("Filter(MeinBereich, Filterbedingung, """")")
Damit bekomme ich ja je nach Filterbedingung eine Zeile oder mehrere zurück.
Da kann das Array nicht wissen, ob ein oder zweidimensional.
Wie gesagt durchlaufe ich mehrere Tabellen, immer dann, wenn es nur eine Rückgabezeile gibt, bekomme ich das Problem.
Vorher dimensionieren ist ja auch nicht möglich, da ich die Anzahl der daten und Spalte nicht kenne, erst nach der Zuweisung.
AW: Array wird falsch aufgebaut
02.02.2021 15:42:08
Nepumuk
Hallo Kay,
damit wertest du eine Formel aus, da muss ich passen. Ich setze die Frage auf offen.
Gruß
Nepumuk
Anzeige
Es gibt in Xl auch Quasi-2d-EinzelWerte, ...
04.02.2021 04:25:24
Luc:-?
…Kay,
da auch jedes EinzelZell-Bereichsobjekt 2 Indizes hat. Etliche Xl-Fktt geben dann eher 1dimensional-1wertige Arrays statt echter Einzelwerte als Ergebnis zurück, zB ZEILE und SPALTE. In VBA kennt man das auch und in anderen Pgmmiersprachen erst recht, da dort idR Array-Objekte auf TensorBasis verwendet wdn, bei denen das ein (skalarer) Tensor(0,0)* wäre. In VBA kann man einen solchen Tensor wie folgt erzeugen:
arX = Array(Array(123)) → beide UBounds, von arX und arX(0), sind hierbei wie die LBounds 0, also quasi 1dimensional, obwohl man hier besser von 0Stufigkeit (r+s=0+0=0) spricht.
* (r,s)-Tensorraum
Handelt es sich in Xl um einen Bereich aus mehreren Zellen, wird ein horizontaler Zeilen- bzw Kovektor bei entsprd Wandlung in VBA als 1d-Array, ein (vertikaler Spalten-) Vektor als 2d-Array umgesetzt, um beide voneinander unterscheiden zu können. Ein quasi-1-dimensionaler Vektor könnte aber nach dem o.g. Prinzip als Tensor(1,0) aus Tensoren(0,0) konstruiert wdn. Ein Tensor vom Typ(0,1) =Kovektor würde so nie automatisch entstehen, aber ein 2d-Kovektor könnte natürlich auch deklariert/dimensioniert wdn, denn seine Indizes würden seine Ausrichtung ja erkennen lassen. Er würde in VBA durch Wandlung nur nicht automatisch entstehen (ebensowenig wie ein 1dimensionaler Vektor).
Das Dimensionsmaximum in VBA beträgt wohl ca 56, ist aber äußerst unhandlich (besser auf Tensoren oder eine Kombi aus beidem ausweichen), während das auf nur ein Blatt abbildbare Dimensionsmaximum in Xl 2 (Matrix) beträgt. Allerdings sind auch per MatrixKonstanten gestapelte Matrizen möglich, von denen aber nur die oberste sichtbar wäre, aber auch alle andern ausgewertet wdn können. Das entspräche einer Pseudo-4-Dimensionalität bzw Matrizen aus Matrizen, die einen Tensorraum bilden (die Matrix ist die Basis von Xl).
Man sieht also, es gibt auf diesem Gebiet allerhand zu beachten (und das ist noch nicht mal alles!)*, wenn man hier mit VBA herangeht.
* ZB diskontinuierlich Bereiche (Areas) und DurchlaufReihenfolgeUnterschiede zwischen Range und Array bei For-Each-Zyklen.
Morhn, Luc :-?
„Die universelle Befähigung zur Unfähigkeit macht jede menschliche Leistung zu einem unglaublichen Wunder.“ Stapps ironisches Paradoxon
Anzeige
AW: Array wird falsch aufgebaut
02.02.2021 15:27:20
Daniel
Hi
wie Nepumuk erkannt hat:
auch wenn MeinBereich nur einzeilig ist, entsteht ein zweidimensionales Array.
das Array hat zwar in der 2. Dimension die Ausdehnung 1 und Excel kann dieses Array bei bedarf wie ein echtes eindimensionales Array verwenden, aber das Array ist grundsätzlich mal zweidimensional.
problematisch wird's nur, wenn der Zellbereich aus einer einzigen Zelle besteht.
dann ergibt MeinArray= MeinBereich kein Array, sondern ein normale Wert-Variable
aber sobald MeinBereich aus 2 oder mehr Zellen besteht, gibt's ein zweidimensionales Array.
Gruß Daniel
Anzeige
AW: Array wird falsch aufgebaut
02.02.2021 15:40:10
Kay
Hallo Daniel,
da ich über Folter gehe (siehe Antwort an Nepumuk), macht VBA leider genau das, eine normale Wert Variable.
Wie kann man da abfangen?
Gruß Kay
AW: Array wird falsch aufgebaut
02.02.2021 16:16:03
Daniel
du meinst wahrscheinlich Filter
das ist jetzt ein bisschen was anderes.
kann ich aber auch nicht viel zu sagen, weil ich mit den neuen Funktionen noch nicht arbeite.
in dem Fall müsstest du halt prüfen, ob du ein ein- oder zweidimensionales Array erhalten hast und wenn ein eindimensionales dann eben per Schleife die Daten aus dem eindimesionalen Array ein zweidimensionales umschaufeln.
Bei Arrays kann man problemlos mit Schleifen arbeiten, die sind schnell genug.
Gruß Daniel
Anzeige
Folter ist doch verboten ;-)
02.02.2021 16:16:25
Rudi
da ich über Folter gehe
Wie kann man da abfangen?
If IsArray(MeinArray) Then
'mach dies
Else
'mach das
End If

Gruß
Rudi
AW: Folter ist doch verboten ;-)
02.02.2021 16:36:23
Kay
Hi Rudi,
leider klappt dass auch nicht. IsArray gibt in beiden Fällen wahr zurück, so dass ich eher auf die Anzahl der Dimensionen prüfen muss.
Laut Recherche gibt es hierzu aber keine Funktion, da muss man wohl oder übel über einen Fehler gehen, den man dann abfängt. Sprich man adressiert die 2. Dimension, die es ja in einem Fall nicht gibt und fängt den Fehler ab.
Alles in allem nicht gerade berauschend....
Vielleicht hat ja noch jemand eine andere Idee.
D&G
Kay
Anzeige
AW: Folter den Array :-) ;bitte um Erläuterung
02.02.2021 16:18:27
GerdL
Moin Kay,
du gibst Excel 2016 als Version an u. schreibst nicht "FILTER" sondern "Filter".
Erstere Excel-Funktion gibt es nach meiner Kurzrecherche ab Excel 365.
Hast du eine andere xl-Version als angegeben oder arbeitest du mit einer Benutzer-definierten Funktion?
Gruß Gerd
Die Herber-Versionsangabe ist maximal 2016 ...
02.02.2021 16:20:40
lupo1
... so dass der geneigte Teilnehmer selbst 2019 oder 365 detaillieren muss.
AW: Folter den Array :-) ;bitte um Erläuterung
02.02.2021 16:30:53
Kay
Hallo Gerd,
ja ich nutze Excel 365 - kann man aber nicht angeben - steht nur 2016 oder höher dabei.
siehe Nachricht von Lupo.
Ich versuche nun mal abzufangen, ob ich ein 2 dimensionales Array oder eindimensionale Variable zurück erhalte.
Mal sehen ob es klappt.
D&G
Kay
Anzeige
AW: Array wird falsch aufgebaut
02.02.2021 16:57:49
Kay
Hier mal ein Lösungsversuch, der die Anzahl der Dimensionen prüft. Somit kann man danach agieren und das Array entsprechend verarbeiten. Ich für mich transponiere es in ein neues zweidimensionales Array, in dem ich die erste Dimension mit 1 dimensioniere und die Zweite dann mit UBound aus dem zurückgegeben eindimensionalen Array. Dann erfolgt noch schnell die Zuordnung und fertig.
Um die Anzahl der Dimensionen eines Arrays zu prüfen scheint dieser Weg derzeit die einzige Möglichkeit zu sein.
' Findet die Anzahl der Matrixdimensionen eines Arrays heraus
Public Function AnzArrayDim(Feld) As Long
AnzArrayDim = -1
If Not IsArray(Feld) Then Exit Function
On Error GoTo AusstiegLaufzeitFehler
Do
AnzArrayDim = AnzArrayDim + 1
Loop While UBound(Feld, AnzArrayDim + 1) >= 0
AusstiegLaufzeitFehler:
End Function
VG Kay
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige