Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1484to1488
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

Arrayfrage: array(array(),array())

Arrayfrage: array(array(),array())
09.04.2016 10:51:32
Arthur

Hallo Excelianer.
Um schnell an ein zweidimensionales Array zu gelangen dachte ich mir: Nimm die Array()-Funktion. Was dabei herauskommt ist ein array, aber nicht wie erwartet.

Sub beispiel()
Dim XArr
XArr = Array(Array("Hello", "World", "!"), Array(42, 7, 12))
End Sub
Wie bekommt man das 'normale' zweidimensionale Array mit Werten gefüllt hin - ohne einzelne Zuweisung?
Weil die Werte vorab bereits bekannt sind, kann vlt. eine Struktur helfen?
Gruß, Arthur.

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Arrayfrage: array(array(),array())
09.04.2016 11:03:05
Beverly
Hi Arthur,
meinst du so:
Sub beispiel()
Dim XArr
ReDim XArr(2, 1)
XArr(0, 0) = "Hello"
XArr(1, 0) = "World"
XArr(2, 0) = "!"
XArr(0, 1) = 72
XArr(1, 1) = 7
XArr(2, 1) = 12
End Sub


AW: Arrayfrage: array(array(),array())
09.04.2016 11:06:11
Gerd L
Hallo Arthur!
XArr = Tabelle1.Cells(1, 1).Resize(4, 3).Value

Gruß Gerd

das ist's noch nicht, dennoch danke
09.04.2016 11:39:41
Arthur
Hallo Karin, hallo Gerd.
Danke für die Vorschläge. Das ist es leider noch nicht. Das Array sieht mit euren Vorschlägen aus, wie es aussehen soll. Zweidimensional. Nur: Der Weg ist das Ziel :)
Das schicke an meiner Idee ist es im Code die Ausprägungen quasi als Liste hinzutippen. Die Einzelzuweisung (row,col)=xxx wollte ich dabei vermeiden. Ebenso die Ablage auf einem Tabellenblatt.
In der Zwischenzeit habe ich den Umweg über Split versucht, leider ebenfalls mit der 'schrägen' Fassung im Ergebnis.
Gruß, Arthur.

Anzeige
und wie soll es...
09.04.2016 11:49:40
Beverly
Hi Arthur,
...denn konkret aussehen? Zuweisen musst du die Werte doch irgendwie. Das macht dein Code auch, nur ist dein Array eben anders aufgebaut - was du so nicht wolltest.


AW: Wasch mich, aber mach mich nicht naß-
09.04.2016 11:54:06
Gerd L
Methode gesucht! :-)
Gruß Gerd

AW: Arrayfrage: array(array(),array())
09.04.2016 12:13:14
Arthur
Hallo ihr beiden.
@K: Ja, zuweisen muss ich es irgendwie. Weil es für mich übersichtlicher ist alles hintereinander zu schreiben dachte ich an den Array-Ansatz. Mir persönlich würde der genügen, insbesondere weil die Daten beieinander stehen. Aber ... der Combobox nicht. Die ziert sich das Ergebnis richtig zu interpretieren :).
@G: Die Tabellenblattversion ist mit am einfachsten. Daher ebenfalls ein guter Vorschlag. Damit ist Code und Inhalt leider getrennt, was der Übersichtlichkeit entgegenwirkt. In zwei Wochen habe ich vergessen, was ich eingetippt habe und bin am Suchen. Nicht nur wegen der Referenz, sondern insb. weil der Code in einem AddIn landen soll (das Worksheet ausgeblendet ist) und weil's noch viel mehr Code gibt.
Nochmals Danke für's Gedanken machen. Irgendwann werde ich in einen der Äpfel beißen müssen.
Gruß, Arthur.

Anzeige
AW: Arrayfrage: array(array(),array())
09.04.2016 12:15:20
Fennek
Hallo,
als Frage habe ich verstanden "schnell an ein 2-d Array zu gelange".
1D

Sub test()
Dim ar
Ar = range("a1:z1")
Ar = application.transpose(range("a1:a20")
End sub
Kein eigene Erfahrung, aber von snb oft vorgemacht:

Sub test()
Dim ar
Ar = range("a1:e25")
End sub
Mfg

yes
09.04.2016 13:05:59
Arthur
Hallo Fennek.
Das ist es. Transpose reorganisiert das Array in die benötigte Form.
Private Sub UserForm_Initialize()
Dim XArr
XArr = Array(Array("Hello", "World", "!") _
, Array(42, 7, 12))
XArr = Application.Transpose(XArr)
ComboBox1.ColumnCount = 2
ComboBox1.List = XArr
End Sub
Gruß un Dank, Arthur.

Anzeige
Array-Typen
09.04.2016 14:53:58
Luc:-?
Was du da erzeugt hast, Arthur,
ist ein Variant mit einem Array, dessen Elemente ebenfalls Arrays sind. Dazu findest du einiges unter dem Stichwort Arrays in Arrays im INet. Diese Array-Form ist recht praktisch und entspricht eigentlich eher der in anderen PgmierSprachen üblichen Form, in denen Arrays meist Objekte sind. Ein Einzelwert wird dann so identifiziert: XArr(i)(j)
Im konkreten Fall handelt es sich um einen senkrechten Vektor, dessen Elemente gleichlange waagerechte Vektoren sind, sonst ließe er sich nämlich nicht, nur mit wf.Transpose, in ein 2dimensionales VBA-Array transformieren (wenn die ursprüngliche Ausrich­tung erhalten bleiben soll, muss das allerdings 2× angewendet wdn!). D.h., alle Vektoren sind 1dimensional, auch der senkrechte HauptVektor. Sonst sind in VBA nur waagerechte Vektoren 1dimensional, senkrechte Vektoren sind 2dimensional. In Xl sind aber wg der TabellenStruktur grdsätzlich auch alle Vektoren stets 2dimensional!
Die (2malige) Transpose-Anwendung ist aber nur in SubProzeduren erforderlich. Das Ergebnis einer UDF in einer solchen Form wird bei Einsatz in einer ZellFml von Xl automatisch transformiert, sofern das möglich ist. Dazu folgende Bspp:
Sub DF_Bsp()
Dim startZeile As Long, startSpalte As Long, XArr
With ActiveWindow.RangeSelection
startZeile = .Row: startSpalte = .Column
End With
XArr = DF_Test
If MsgBox(Cells(startZeile, startSpalte).Resize(UBound(XArr) + 1, _
UBound(XArr(0)) + 1).Address(0, 0), vbInformation + vbOKCancel, _
"Bereich nach Tfo") = vbCancel Then Exit Sub
With WorksheetFunction
XArr = .Transpose(.Transpose(XArr))
End With
Cells(startZeile, startSpalte).Resize(UBound(XArr, 1), _
UBound(XArr, 2)) = XArr
End Sub
Function DF_Test()
DF_Test = Array(Array("Hello", "World", "!"), Array(42, 7, 12))
End Function
Die Fkt kann in einer MatrixFml so getestet wdn: {=DF_Test()}
Und natürlich zuvor alle 6 Zellen auswählen!
Feedback nicht unerwünscht! Gruß, Luc :-?
Besser informiert mit …

Anzeige
Bin mal deinem Link gefolgt und kann deshalb ...
09.04.2016 20:18:46
Luc:-?
…mein früheres Lob auch hier wiederholen, snb;
eine gewohnt fleißige, detailreiche und sehr ausführliche Arbeit.
Leider kommt der Array-Typ, der Ausgangspkt dieses Threads ist, immer noch viel zu kurz. Er wird quasi fast nur indirekt bei der Abhandlung von ParamArrays erwähnt. Diese entsprechen natürlich diesem Array-Typ, sind aber idR nicht rechteckig und können deshalb nicht oW in Xl abgebildet wdn.
Arthur hat aber ein rechteckiges Array dieses Typs gebildet, das prinzipiell nicht nur in Xl in Gänze abbildbar wäre, dazu muss es nur transformiert oder von einer UDF in einer ZellFml erzeugt wdn, sondern auch leicht in EinzelZeilen zerlegt wdn könnte:
XArr repräsentiert hier das ganze Array, XArr(i) eine seiner Zeilen, XArr(i)(j) einen Einzelwert. Würde man es transformieren (nicht mit wf.Transpose transponieren!), erhielte man mit XArrT(j) eine ganze Spalte des Ausgangs-Arrays (als Zeile) und mit XArrT(j)(i) einen Einzelwert.
Ein nicht rechteckiges Array kann nur dann auf einfache Weise transformiert und somit in Xl abgebildet wdn, wenn alle seine Zeilen auf die gleiche ElementeAnzahl gebracht wdn, was ein rechteckiges Array ergibt. Da ein solches Array idR 1dimensional (wie XArr) ist, wäre das kein Problem. Arrays, deren Elemente nicht nur aus Skalaren und 1dimensionalen Vektoren bestehen, können ohnehin nicht in Gänze auf Xl-ZellBereiche abgebildet wdn.
Man kann natürlich auch ein 2dimensionales Array bilden und seine Elemente ebenfalls mit höherdimensionalen Arrays belegen. Damit kann aber nur VBA, nicht Xl umgehen.
Dann ist mir unter Pkt 6.16.3 noch Folgendes aufgefallen (Zitat):
"I wasn't able to distil a common criterion which formulae accept arrays as argument. Nor the worksheet input help, nor Intellisense in VBA gave much clues. So it's also a question of 'trial & error'."
I am able, 'cos the formula-assistant helps! Der zeigt nämlich an, was eine Xl-Fkt erwartet und auch, was sie ermittelt! Im Falle eines Arrays wird die Argument- bzw Ergebnis­Anzeige (ganz rechts bzw darunter) mit Matrix-{} versehen. Somit kann man leicht erkennen, ob die Worksheet­Function ein Array als ein bestimmtes Argument akzeptiert oder nicht. Aus der Form der Ergebnis­Anzeige kann man dann entnehmen, dass bspw die Xl-Fktt ZEILE und SPALTE stets ein Array liefern, auch, wenn es nur einen Wert enthält. Ein solches Ergebnis würde dann idR nicht von einer WorksheetFunction oder UDF akzeptiert wdn, die an seiner Stelle einen skalaren Wert als Argument erwartet!
Gruß + schöSo (beautiful Sunday), Luc :-?

Anzeige
AW: Bin mal deinem Link gefolgt und kann deshalb ...
09.04.2016 21:42:24
snb
Ich verstehe die Anfangsfrage doch anders.
Sub M_snb()
sn = Array(1, 2, 3)
sp = Application.MMult(Application.Transpose(sn), sn)
MsgBox UBound(sp) & vbTab & UBound(sp, 2) & vbLf & sp(1, 1) & vbTab & sp(1, 2) & vbTab & sp( _
1, 3) & vbLf & sp(2, 1) & vbTab & sp(2, 2) & vbTab & sp(2, 3) & vbLf & sp(3, 1) & vbTab & sp(3, 2) & vbTab & sp(3, 3)
End Sub

Und ich habe mich hier nur auf deinen Link ...
10.04.2016 02:14:40
Luc:-?
…und das dort umfänglich von dir Dargestellte bezogen, snb;
zum Thread-Thema habe ich weiter oben geschrieben (Array-Typen).
Übrigens solltest du im englischen Text noch einige niederländische en durch englische and ersetzen…! ;-)
Luc :-?

Anzeige

23 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige