Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 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
Anzeige

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
Anzeige
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
Anzeige
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
Anzeige
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
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Array um Dimension erweitern in Excel VBA


Schritt-für-Schritt-Anleitung

Um ein eindimensionales Array in ein zweidimensionales Array in Excel VBA umzuwandeln, kannst du folgende Schritte befolgen:

  1. Erstellen des initialen Arrays: Definiere dein eindimensionales Array. Zum Beispiel:

    Dim aListe
    aListe = Array("Birne", "Zitrone", "Kirsche", "Zwetschke", "Banane")
  2. Transponieren des Arrays: Verwende die Transpose-Funktion, um das Array für die Umwandlung vorzubereiten:

    aListe = WorksheetFunction.Transpose(aListe)
  3. Erweitern der Dimension: Nutze ReDim Preserve, um die Dimensionen des Arrays zu erweitern, ohne die vorhandenen Werte zu verlieren:

    ReDim Preserve aListe(1 To UBound(aListe, 1), 1 To 3)

Mit diesen Schritten kannst du die Array-Dimension in VBA dynamisch erweitern.


Häufige Fehler und Lösungen

  • Fehler: "Fehler beim Ändern der Array-Dimension"
    Lösung: Stelle sicher, dass du ReDim Preserve verwendest, um die vorhandenen Werte zu erhalten. Andernfalls wird das Array geleert.

  • Fehler: Transpose funktioniert nicht wie erwartet
    Lösung: Überprüfe, ob du das Array korrekt transponierst. Transpose ändert die Dimensionen von Zeilen und Spalten.


Alternative Methoden

Es gibt auch alternative Methoden, um ein Array zu erweitern. Eine Möglichkeit ist die Verwendung von Arrays in einem Array. Dies ermöglicht eine flexiblere Handhabung und kann bei der Arbeit mit mehrdimensionalen Arrays nützlich sein. Hier ein Beispiel:

Dim aListe(1 To 5) As Variant
Dim i As Long

For i = 1 To 5
    aListe(i) = Array("Element" & i)
Next i

Diese Methode kann hilfreich sein, wenn du ein mehrdimensionales Array füllen möchtest, ohne die Dimensionen im Voraus festzulegen.


Praktische Beispiele

Hier sind einige praktische Beispiele, wie du deine Arrays erweitern kannst:

  1. Einfaches zweidimensionales Array:

    Dim arr(1 To 5, 1 To 3) As String
    Dim i As Long
    
    For i = 1 To 5
        arr(i, 1) = "Element" & i
    Next i
  2. Dynamisches Array mit ReDim Preserve:

    Dim aListe() As String
    Dim i As Long
    
    ReDim aListe(1 To 1)
    aListe(1) = "Birne"
    
    For i = 2 To 5
        ReDim Preserve aListe(1 To i)
        aListe(i) = "Element" & i
    Next i

Tipps für Profis

  • Verwende ReDim Preserve sparsam: Es ist effizienter, die Größe eines Arrays nur einmal zu definieren, wenn möglich.
  • Vermeide zu viele Dimensionen: Halte die Anzahl der Dimensionen in deinem Array so gering wie möglich, um die Lesbarkeit und Wartbarkeit deines Codes zu erhöhen.
  • Nutze Option Base: Stelle die Basis deines Arrays auf 1, um die Lesbarkeit zu verbessern.

FAQ: Häufige Fragen

1. Kann ich ein Array mit mehr als zwei Dimensionen erstellen?
Ja, in VBA kannst du mehrdimensionale Arrays erstellen, allerdings kannst du nur die letzte Dimension mit ReDim Preserve ändern.

2. Was ist der Vorteil von Transpose?
Transpose ermöglicht es dir, die Zeilen und Spalten eines Arrays zu vertauschen, was bei der Arbeit mit Tabellen und Matrizen hilfreich ist.

3. Wie funktioniert ReDim Preserve genau?
Mit ReDim Preserve kannst du die Größe eines Arrays ändern, ohne die bereits enthaltenen Werte zu verlieren. Dies ist besonders nützlich, wenn du die Größe eines Arrays dynamisch ändern musst.

Durch die Anwendung dieser Methoden und Tipps kannst du die Array-Dimension in Excel VBA effizient erweitern und die Leistung deiner Programmierung optimieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige