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

schnell zweidim- Array schreiben

schnell zweidim- Array schreiben
03.04.2023 16:10:33
Florian

Hallo

wie kann man schnell ein zweidimensionales Array erstellen? Mit schnell meine ich, in einer Zeile. So wie man mit array schnell ein eindimensionales array schreiben kann. Siehe Beispiel.


Sub Matrix_Schreiben()
    Dim Vektor, Matrix
    Vektor = Array(2, 3, 4)
    
    'So geht's nicht:
    'Matrix = Array((2, 3), (10, 20), ("k", "t"))
    'Matrix soll 2x3 sein.
    Debug.Print Matrix(1, 1)
End Sub


LG, Florian

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: schnell zweidim- Array schreiben
03.04.2023 16:27:54
onur
    'So geht's doch:
    Matrix = Array(Array(2, 3), Array(10, 20), Array("k", "t"))


das erzeugt kein 2-dim Array, ...
03.04.2023 16:37:31
Rudi Maintaire
Hallo,
... sondern ein 1-dim Array, das 3 1-dim Arrays mit je 2 Elementen enthält.

Was der TE möchte, geht imho nicht, bzw. nur wenn er die Elemente in Tabellen hat.

Gruß
Rudi


Richtig!
03.04.2023 19:26:56
Luc:-?
Und das Ganze ist vertikal orientiert, Rudi & Onur.
Im Grunde genommen ist das ein 2stufiger Tensor(1,1), vglbar einer (2dim) Matrix, aber nicht dasselbe.
Würde man statt der 2elementigen, horizontal gerichteten Vektor-Elemente des vertikalen Vektors 1elementige verwenden, würde man so einen 1stufigen vertikalen Tensor bilden, der iW einem echten (1dim) Vektor (vertkal orientiert) entspräche, der mit der üblichen Xl/VBA-Dimensionierung nicht bzw nur als (2dim) Matrix zu erreichen wäre.
Gruß, Luc :-?


Anzeige
AW: Richtig!
05.04.2023 14:28:53
Florian
Endlich, Luc tritt auf.

Hallo Luc,

ich verstehe Deinen Beitrag nicht ganz, eigentlich überhaupt nicht.

Was ist ein vertikaler oder horizontaler Vektor?
Ich verstehe unter einen Vektor ein eindimensionales Array, zB array(3, 1, 4, 1, 5, 9). Wenn man statt der Zahlen eindimensionale Arrays einsetzt, dann wäre das ein Vektor, der aus verschiedenen Vektoren besteht, die unterschiedlich groß sein können. Wo ist da jetzt was horizontal oder vertikal?

LG, Florian


AW: Richtig!
06.04.2023 19:09:16
Yal
Hallo Florian,

willkommen in Visual Basic!
Wer gewohnt ist, mit moderneren Sprachen zu arbeiten (Python, C++, ...), muss in VBA Abstrich machen.
Die direkte Befüllung einer mehrdimensionalen Array geht nicht. Nicht mal 2.

Folgender Test:
Sub test()
Dim Arr
Dim Arr2()
Dim x, y
    
' Array of Array erzeugen.
    Arr = Array(Array(1, 2), Array(3, 4), Array(6, 7, 8))
'Länge ("Size") der zweiten Dimension ermitteln
    For x = LBound(Arr) To UBound(Arr)
        If UBound(Arr(x)) > y Then y = UBound(Arr(x))
    Next
'Länge ("Size") der ersten Dimension ermitteln
    x = UBound(Arr)
'2-dimensional Ziel-Array dimensionieren
    ReDim Arr2(x, y) 'Note: Nur beim ersten Init kann man beide Dimensionen setzen, sonst nur die zweite beeinflüssen
'Daten übertragen
    For x = LBound(Arr) To UBound(Arr)
        For y = LBound(Arr(x)) To UBound(Arr(x))
            Arr2(x, y) = Arr(x)(y)
        Next
    Next
End Sub
Man erzeugt einen Array of Array, prüft die Dimensionierung (ich war faul und habe nur 2 Dim verwendet),
dimensioniert den Ziel-Array, und überträgt die Daten.
Disclaimer: ich verwende LBound, lower bound, anstatt null. Es ist aber sinnlos, weil es nicht functioniert, wenn LBound > 0 ist, wegen Redim Arr2(x, y)

Also ein Einzeiler sieht anders aus :-)
Es sei denn man packt das gesamte in einer Function.

Unbeantwortet bleibt, ob es Sinn ergibt, umzutopfen.

VG
Yal


Anzeige
AW: schnell zweidim- Array schreiben
03.04.2023 16:42:09
Daniel
Nein, so geht's auch nicht.
So wird Matrix nicht zweidimensional, sondern eindimensional mit ebenfalls eindimensionalen Arrays als Werten.
Man kann Matrix so nicht direkt in die Tabelle zurückschreiben und auch beim Programmieren muss man etwas anders vorgehen als bei einem echten zweidimensionalen Array:
das fängt damit an, dass du die 2. Dimension nicht abfragen kannst (Ubound(Matrix, 2)), weil die bei jedem Wert anders sein könnte und man muss auch die Einzelwerte anders ansprechen: Matrix(0)(0) statt Matrix(0, 0)

um ein echtes zweidimensionales Array zu erhalten, muss man dieses Konstrukt noch transponieren:
je nach anordnung der Datein ein- oder zweimal:
Matrix = Array(Array(2, 3), Array(10, 20), Array("k", "t"))
Matrix = WorksheetFunction.Transpose(WorksheetFunction.Transpose(Matrix))
Matrix = Array(Array(2, 10, "k"), Array(3, 20, "t"))
Matrix = WorksheetFunction.Transpose(Matrix)
Gruß Daniel


Anzeige
AW: schnell zweidim- Array schreiben
03.04.2023 16:55:16
Florian
Hallo

Array in array wollte ich nicht, dafür habe ich ja "Debug.Print Matrix(1, 1)" geschrieben.

Danke Daniel, "Transpose" hilft.

Mit eindimensionalen arrays in arrays zu arbeiten als mit zweidimensionalen wird mir immer sympathischer. Aber manchmal sind solche Matrixformen doch einfacher.

Schönen Abend noch udn liebe Grüße,


AW: schnell zweidim- Array schreiben
03.04.2023 17:04:19
Daniel
kommt immer darauf an, was man machen will.
Mehr Freiheitsgrade und Flexibilität bedingen meisten mehr Komplexität an anderer Stelle.

ich stelle mir solche Arrays gerne als Makramee-Arbeit vor:
ein Einzelwert = eine Holzperle
ein eindimensionales Array = eine Perlenschnur
ein zweidimensionales Array = ein Perlenteppich

das Array in Array ist dann eine Perlenschnur, die anstelle von einzelnen Perlen aus weitern Perlenschnüren geknüpft ist. Du hast also einen Hauptstrang und davon ausgehend die Nebenstränge.

Gruß Daniel


Anzeige
AW: schnell zweidim- Array schreiben
03.04.2023 17:05:55
onur
Sozusagen ein Perlenvorhang.


Ein mehrdimensionales Array ...
03.04.2023 19:35:44
Luc:-?
…ist VBA-typisch, Florian,
die meisten anderen PgmmierSprachen verwenden Tensoren (vgl oben).
Gruß, Luc :-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige