Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1692to1696
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 um Dimension erweitern

Array um Dimension erweitern
02.06.2019 20:52:34
Barbara
Hallo
In meinem Code stehen fogende Zeilen:
Dim aListe
aListe = Array("Birne", "Zitrone", "Kirsche", "Zwetschke", "Banane")
Kann man das in ein zweidimensionales Array mit 3 Spalten umwandeln, das die o.g. Worte in der ersten Spalte hat?
Oder muss ich aListe gleich anders formuklieren?
LG,
Barbara

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

Betreff
Datum
Anwender
Anzeige
AW: Array um Dimension erweitern
02.06.2019 21:32:46
onur
Du kannst nur die Grenzen ändern, aber nicht die Anzahl der Dimensionen.
AW: Array um Dimension erweitern
02.06.2019 21:50:57
Daniel
Hi
in dem Fall geht das:
aListe = Array("Birne", "Zitrone", "Kirsche", "Zwetschke", "Banane")
aListe = WorksheetFunction.Transpose(aListe)
ReDim Preserve aListe(1 To UBound(aListe, 1), 1 To 3)
Gruß Daniel
AW: Array um Dimension erweitern
02.06.2019 21:59:21
Nepumuk
Hallo Daniel,
einen Zwischenschritt kannst du sparen:
aListe = WorksheetFunction.Transpose(Array("Birne", "Zitrone", "Kirsche", "Zwetschke", "Banane"))
ReDim Preserve aListe(1 To UBound(aListe, 1), 1 To 3)
Gruß
Nepumuk
AW: Array um Dimension erweitern
02.06.2019 22:19:12
Daniel
ja, kann man.
was bringts?
ist das schneller?
Leserfreundlicher?
leichter verständlich?
wo liegt der vorteil?
weniger Befehle sinds ja nicht.
Gruß Daniel
Anzeige
AW: Array um Dimension erweitern
03.06.2019 11:07:39
Nepumuk
Hallo Daniel,
warum gleich so giftig?
Schließlich bist es du der sich zu 90% in Beiträge einmischt um deine tolle Lösung zu präsentieren.
Gruß
Nepumuk
AW: Array um Dimension erweitern
03.06.2019 16:45:34
ASC_254
nur solltest du dann etwas mehr Variation zeigen, als einfach nur zwei Funktionen ineinander zu schachteln.
AW: Array um Dimension erweitern
05.06.2019 20:18:42
Barbara
Hallo alle,
wie ich verstehe, ist mit "Transpose" eine Dimensionserweiterung von 1 auf 2 Dimensionen möglich.
Und Luc hat mit schlauen Tricks einen Weg gefunden, um auch noch weitere Dinensionen zu realisieren.
Problem gelöst. Danke an ASC_254, Daniel, Luc (?), Nepumuk, onur.
LG, Barbara
AW: Array um Dimension erweitern
05.06.2019 20:29:39
Nepumuk
Hallo Barbara,
da liegst du falsch. Transpose kippt das Array aus der Array-Funktion um 90° damit es in der ersten Spalte des mit Redim erweiterten Arrays liegt. Ohne Transpose würden die Werte in der ersten Zeile des Arrays liegen.
Normalerweise würde durch Redim das Array wieder geleert, aber durch den Zusatz Preserve bleiben die schon vorhandenen Inhalte erhalten.
Gruß
Nepumuk
Anzeige
Ja, man es dazu verwenden, oder besser gesagt,
05.06.2019 21:13:07
Daniel
missbrauchen, weil es nicht der gedachte Zweck ist.
Wie Nepumuk schrieb, dient das Transpose dazu, um bei einem zweidimensionalen Array Zeilen mit Spalten zu vertauschen, dh um einen Turm in einen Bungalow zu verwandeln und umgekehrt.
Daher ist die Anwendung auch nur mit einem zweidimensionalen Array sinnvoll.
Allerdings ist VBA eine anwenderfreundliche Sprache, welche versucht solche Anwenderfehler auszubügeln um trotzdem zu einem Ergebnis zu kommen, sofern das möglich ist.
Dh in diesem Fall wird das eindimensionale Array als zweidimensionales Array mit einer Zeile interpretiert und damit kann das Transpose dann durchgeführt werden.
Gruß Daniel
Anzeige
Das hängt so zusammen, ...
05.06.2019 21:46:21
Luc:-?
…Barbara,
wie Nepumuk schrieb, wird durch MTRANS (.Transpose) das 1dimensionale VBA-Array transponiert (hier quasi beim 1.Element nach unten „gekippt“). Ein solches Array, das einem (vertikal orientierten) Vektor entspräche, wird zwecks Unterscheidung von einem hori­zon­tal orientierten Kovektor auch in VBA stets 2dimensional dargestellt. Damit wäre dann schon mal eine 2.Dimension angelegt, die nur noch erweitert wdn muss (vgl Nepumuk).
Bei meinem Vorschlag wird kein 2dimensionales VBA-Array erzeugt, sondern ein 2stufiger Tensor. So etwas wird in vielen Pgmmier­Spra­chen anstelle einer 2dimensionalen Matrix verwendet, weil es sich leichter manipulieren lässt. Deshalb kommt es wohl auch in VBA vor, obwohl VBA sonst eher auf die Bedürfnisse von Xl zugeschnitten ist, bei dem jedes Array 2dimensional ist (Zeile und Spalte), auch ein (Ko-)Vektor. Ein Einzelwert kann in Xl folglich entweder nur ein Skalar oder ein 2dimensionales Array mit nur 1 Element sein. Ein 1dimensionales Array kommt dagegen nur in VBA vor und stellt immer einen (horizontal orientierten) Kovektor dar (der aber pro­blem­los auf einen ZellBereich abgebildet wdn kann). In der Mathematik ist dagegen der 1dimensionale Vektor der Normalfall. Den kann man in VBA nur erreichen, wenn man einen Tensor (→ Vektor) bildet, dessen Elemente aus 1elementigen Arrays - skalaren Tensoren(0,0) - bestehen. Da alle diese Arrays im VBA-Sinne 1dimensional und im Prinzip voneinander unabhängig sind, kann auch die ElementeAnzahl jedes Arrays für sich (über eine Hilfsvariable) neu festgelegt (redi­mensioniert) wdn. Darauf deutet auch ihre Bezeichnung als mehr­stu­fig (statt mehrdimensional) hin.
Übrigens kann man in VBA auch echte n-dimensionale Arrays bilden, nur lässt sich immer nur deren letzte Dimension redimensionieren. Bei mehr als 2 Dimensionen kann's also kompliziert wdn und direkt auf Xl abbilden lässt sich so etwas natürlich auch nicht.
Luc :-?
Anzeige
AW: Das hängt so zusammen, ...
06.06.2019 11:04:23
Barbara
Hallo Luc,
danke für Deine sehr ausführliche Antwort. Klingt alles sehr interessant, kann dem wegen bescheidenen Wissensstands nur beschränkt folgen.
Das Prinzip der Stufigkeit im Vgl zur Dimension habe ich verstanden, theoretisch zumindest.
Allein, mein Anwendungsgebiet wird zwei Dimensionen kaum überschreiten. Aber wer weiß.
LG,
Barbara
Bitte sehr, ...
06.06.2019 18:12:25
Luc:-?
…Barbara,
weitere Erläuterungen zu meinem Vorschlag findest du im Internet (im Archiv dieses und anderer Foren) und zur Tensor-Problematik auch auf Wikipedia.
Luc :-?
Es gibt noch eine andere Möglichkeit, ...
02.06.2019 23:55:24
Luc:-?
…Barbara,
nämlich einen Tensor(1,1) zu erzeugen, in VBA-Kreisen auch als Arrays in an Array bekannt. Dadurch kann auf die Xl-Fkt MTRANS (.Transpose) verzichtet wdn, die hier ansonsten einen 2dimen­sionalen Vektor, eigentlich eine Matrix aus 5 Zeilen und 1 Spalte, erzeugt.
Dieser Tensor besteht also aus einem Vektor (vertikal orientiert), dessen Elemente aus Kovektoren (horizontal orientiert) bestehen, zuerst mit nur einem Element, was aber schon reicht, um einen echten 1dimensionalen Vektor anzulegen. Eine Matrix in Form eines sol­chen 2stufigen Tensors hat den Vorteil, dass jede ihrer Stufen 1dimensional ist und unabhängig von ihrer Stellung erweitert wdn kann. Bei mehrdimensionalen Matrizen kann man das immer nur für die letzte Dimension machen. Es gibt aber auch einen Nachteil → mit einer SubProzedur kann ein solcher Tensor nicht direkt in Gänze in einen ZellBereich geschrieben wdn, da er quasi irregulär ist. VBA kann ihn aber problemlos auch einzelwertweise verarbeiten, wenn man die andere Indizierungsmethode beachtet → aList(0) meint das 1.Element des Vektors, also alle Elemente dieses Kovektors, aList(0)(0) dann nur das 1.Element des Kovektors, der das 1.Element des Vektors bildet. Verwendet man einen solchen Tensor in einer UDF (Fktsprozedur), die in einer ZellFml eingesetzt wird, hat man keine AusgabeProbleme, da Xl alle Array-Typen, die einer regulären rechteckigen Matrix entsprechen, auch ausgeben kann, nur eben eine VBA-SubProzedur nicht, denn hierbei stellt Xl nur das AusgabeMedium und ist selbst nicht berechnend aktiv.
    Const ubElem As Long = 2
Dim i As Long, aLi, aListe
aListe = Array("Birne", "Zitrone", "Kirsche", "Zwetschge", "Banane")
For Each aLi In aListe
aLi = Array(aLi): ReDim Preserve aLi(ubElem)
aListe(i) = aLi: i = i + 1
Next aLi
Gruß, Luc :-?
„Der beste Beweis für intelligentes Leben im Universum ist, dass noch niemand versucht hat, Kontakt mit uns aufzunehmen.“ H.Lesch, 2018, Sonneberg
Deshalb Intelligenz steigern mit …

Anzeige
AW: Array um Dimension erweitern
03.06.2019 03:13:05
Daniel
Wenn die Dimensionen und deren Größe schon vorab bekannt sind, kann man auch gleich ein entsprechendes echtes 2-D-Array erstellen und per Schleife befüllen.
beim Arbeiten mit Arrays stellen Schleifen in der Regel kein Performance-Problem dar:
dim Txt
dim i as long
dim arr(1 to 5, 1 to 3)
for each Txt in Array("Birne", "Zitrone", "Kirsche", "Zwetschke", "Banane")
i = i + 1
arr(i, 1) = Txt
Next
Gruß Daniel

16 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige