Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1516to1520
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
Mehrere Spalten in Array speichern
12.10.2016 09:06:11
herman
Hallo,
ich würde gerne die Values einer Range, die sich über mehrere Spalten zieht, in einem Eindimensionalen-Array ablegen. Bei nur einer Spalte nutze ich immer die Funktion "Transpose" um die Umwandlung in ein eindimensionales Array durchzuführen.
Wie gehe ich bei mehreren Spalten vor? (ich möchte nur die Werte aus den Zelle Speichern, nicht die Adresse o.ä.)
   Arr = WorksheetFunction.Transpose(ActiveSheet.Range("K4:N10000"))
For i = LBound(Arr) To UBound(Arr)
If Arr(i)  "" Then 

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Mehrere Spalten in Array speichern
12.10.2016 09:12:42
Fennek
Hallo,
nach meinem Verständnis kann man keinen 2-dim Bereich in ein 1-dim überführen.
Aber natürlich geht
Arr = Range("K4:N10000")
als 2-dim Array
mfg
Nach MEINEM Verständnis kann man das schon, ...
12.10.2016 15:25:06
Luc:-?
…Fennek,
indem man entweder so vorgeht, wie Daniel es als letzte Möglichkeit vorschlug, oder einen Vektor bildet, dessen Elemente ebenfalls aus Vektoren bestehen. Solche Vektoren sind stets 1dimensional, wobei der Haupt­Vektor vertikal, seine Element­Vektoren horizontal (aus-)gerichtet sind. Letzteres ist übrigens auch die einzige Möglichkeit, einen vertikal gerichteten 1dimensionalen Vektor zu erzeugen.
Bsp: vektorenVektor = Array(Array(1, 2, 3), Array(4, 5, 6))
vektorenVektor(1) wäre dann {4.5.6} und vektorenVektor(1)(1) ergäbe 5.
Der vertikale 1dimensionale Vektor bestünde dann aus horizontalen Vektoren mit nur 1 Element:
vertikalVektor = Array(Array(1), Array(2), Array(3))
So etwas kann aber nur von einer UDF in einer ZellFml direkt als Ergebnis ausge­geben wdn, weil Xl das Ergebnis automatisch in eine dar­stell­bare Form (2dimen­sionale Matrix) trans­formiert. In einer Sub­Prozedur muss man das selbst pgmmieren.
Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Nach MEINEM Verständnis ist ein Array nur dann
12.10.2016 16:17:55
Daniel
eindimensional, wenn man einen Index benötigt, um aus dem Array den Einzelwert zu erhalten.
In deinem Konstrukt benötigt man aber immer noch 2 Indizes, um auf den Einzelwert zu kommen.
Gruß, Daniel
Na und, 1dimensional ist es trotzdem! ;-]
12.10.2016 19:16:26
Luc:-?
Die Anzahl der Indizes eines Einzelwerts war auch gar nicht erwähnt…
Außerdem kann man so bei Bedarf mit nur einem Index ein ganzes Datenfeld ansprechen. Weitere Vorteile solltest du ohnehin kennen.
Übrigens, statt deiner letzten Variante könnte man auch ein Dictionary verwenden. Das kann meinem oder deinem Array analog angelegt wdn.
Gruß, Luc :-?
AW: Na und, 1dimensional ist es trotzdem! ;-]
12.10.2016 19:32:56
Daniel
doch Luc.
es hieß "Eindimensional"
und das heißt für mich, dann man nur einen Index hat um auf den Wert zu kommen, dh
Array(x)
Array(x, y) ist zweimensional
dein Konstrukt ergibt Array(x)(y) und das sind nun mal zwei Indizes, weil du nur mit Array(x) noch keinen Einzelwert, sondern ein weiteres Array bekommst.
Sicherlich ist das übergeordnete Array dann eindimensional, aber das gesamte Konstrukt ist es nicht.
Dicitonarys sind dann sinnvoll, wenn der Index nicht über eine Zahlenfolge gebildet werden soll, sondern über einen Freitext.
Gruß Daniel
Anzeige
Was es für DICH heißt, ist unerheblich, ...
12.10.2016 23:07:24
Luc:-?
…Daniel,
relevant ist nur, was es ist! Im Falle eines vertikalen Vektors hätte man beim klassischen VBA-Array auch 2 Indizes und damit die ReDim-Einschränkungen, die man nur durch Transponieren umgehen könnte. Beim auf die gezeigte Weise gebildeten vertikalen Vektor hat man die nicht und auch sonst nicht bei Vektoren als Elemente eines Vektors. Und weitere Vorteile dieser Vorgehens­weise scheinen dir wohl doch nicht bewusst zu sein, denn sie liegen gerade in dem, was in deiner AW quasi als Mangel genannt wird…
Wie der Index eines Dictionarys gebildet wird, ist übrigens schnurz. Es ähnelt ja nur einem assoziativen Array, das es in VBA (sonst) nicht gibt.
Luc :-?
Anzeige
AW: Was es für DICH heißt, ist unerheblich, ...
12.10.2016 23:29:41
Daniel
OK, für dich ist ein Vektor mir Vektoren als Elemente das gleich wie ein Vektor mit Einzelwerten als Elemente?
Über Vor- und Nachteile haben wir doch noch gar nicht geredet, also unterlassen bitte deine Spekulationen bezüglich meines Wissens.
Der Tatsache, dass es dem Dictionary schnurz ist was man als Index verwendet, habe ich ja auch nicht widersprochen.
Primär schon, nämlich ein Vektor, der außerdem ...
13.10.2016 00:05:48
Luc:-?
per sé 1dimensional ist, Daniel,
im Prinzip wie ein ParamArray.
Was du weißt oder nicht, ist für mich prinzipiell irrelevant. Allerdings nahm ich an, dass du die Vorteile dieses anderweitig üblichen Array-Typs für xlVBA kennen würdest.
Was verwundern könnte, ist allerdings, warum und wie du dich hier ins Zeug legst, obwohl du gar nicht direkt angesprochen wurdest. Aber das kennt man ja nun schon von dir…
Was das Dictionary betrifft, hast du aber eine Vorrang-Aussage (im Sinne einer Empfehlung) gemacht…
Und jetzt habe ich Wichtigeres zu tun!
Luc :-?
Anzeige
AW: solange etwas vertikal und horizontal
13.10.2016 14:20:32
Daniel
angeordnet ist (und so hast du ja dein Konstrukt beschrieben) ist nicht mehr eindimensional, den bei Eindimensionalität gibt es kein horizontal und vertikal.
dass dein Konstrukt Vorteile für die Programmierung haben kann, habe ich ja auch gar nicht abgestritten oder was gegenteiliges behauptet.
und warum sollte ich keine Vorrangaussage in Bezug auf die Verwendung von Dictionarys und Arrays machen?
Gruß Daniel
Du verwechselst hier die Darstellung in Xl mit ...
13.10.2016 15:28:56
Luc:-?
…der VBA-Form, Daniel;
in Xl gibt es keine 1Dimensionalität, alles basiert auf dem 2dimensionalen MatrixKonzept, auch sog Vektoren (nur 1 Spalte bzw Zeile). In VBA gibt es aber auch 1dimensionale, stets horizontal gerichtete Vektoren (Zitat: …bei Eindimensionalität gibt es kein horizontal und vertikal → das ist schlicht falsch, selbst in rein mathematischem Sinne!). Einen senkrechten Vektor kann man dann nur durch eine 2.Dimension kenn­zeichnen oder muss auf das alternative Array-Konzept ausweichen. Dieses entspricht weit­gehend dem anderer Pgmmier­Sprachen, in denen ein Array oft ebenfalls Objekt­Status hat. Matrizen wdn dort (und auch hierbei) als Vektoren, deren Elemente ebenfalls aus Vektoren bestehen, betrachtet.
Der mehrdimensionale Aufbau eines Arrays ist (xl-geschuldet) typisch für VBA, weshalb das bspw in JavaScript als VBA-Array firmiert. Das ist für viele Anwendungs­fälle viel zu unhandlich.
Dass ein nach dem von mir genannten Konzept gebildetes Array (pgm­technisch) mitnichten 2dimensional ist, erkennt man spätestens dann, wenn man es aus einer SubProzedur heraus direkt auf einen ZellBereich abbilden will…
Ansonsten kannst du Aussagen machen wie du willst, nur richtig u/o ver­all­gemeiner­bar sollten sie schon sein…
Luc :-?
Anzeige
AW: Du verwechselst hier die Darstellung in Xl mit ...
13.10.2016 19:18:49
Daniel
das ein 1-D-Array in einen horizontalen Vektor gewandelt ist meiner Ansicht nach der Anwenderfreundlichkeit von VBA geschuldet, welche dann mit der Impliziten Typumwandlung hilfreich einspringt, anstatt einen TypeMismatcherror auszugeben.
das der Vektor dann horizontal wird und nicht vertikal, ist ja auch nur eine Konvention.
Und auch diese Konvention wird nicht eingehalten, wenn es sinnvoll ist, denn wenn du beispielsweise ein 1-D-Array einer Listbox als Datenquelle zuweist, wird daraus ein vertikaler Vektror und kein horizontaler.
Gruß Daniel
AW: Du verwechselst hier die Darstellung in Xl mit ...
13.10.2016 19:28:54
Daniel
das ein 1-D-Array in einen horizontalen Vektor gewandelt ist meiner Ansicht nach der Anwenderfreundlichkeit von VBA geschuldet, welche dann mit der Impliziten Typumwandlung hilfreich einspringt, anstatt einen TypeMismatcherror auszugeben.
das der Vektor dann horizontal wird und nicht vertikal, ist ja auch nur eine Konvention.
Und auch diese Konvention wird nicht eingehalten, wenn es sinnvoll ist, denn wenn du beispielsweise ein 1-D-Array einer Listbox als Datenquelle zuweist, wird daraus ein vertikaler Vektror und kein horizontaler.
Gruß Daniel
Anzeige
AW: Du verwechselst hier die Darstellung in Xl mit ...
13.10.2016 19:30:01
Daniel
das ein 1-D-Array in einen horizontalen Vektor gewandelt ist meiner Ansicht nach der Anwenderfreundlichkeit von VBA geschuldet, welche dann mit der Impliziten Typumwandlung hilfreich einspringt, anstatt einen TypeMismatcherror auszugeben.
das der Vektor dann horizontal wird und nicht vertikal, ist ja auch nur eine Konvention.
Und auch diese Konvention wird auch nicht immer eingehalten, bspw wenn du ein 1-D-Array einer Listbox als Datenquelle zuweist, wird daraus ein vertikaler Vektor und kein horizontaler.
Gruß Daniel
Ob das anwenderfreundlich ist, will ich mal ...
13.10.2016 20:55:26
Luc:-?
…dahingestellt sein lassen, Daniel;
wahrscheinlich ist es eher allgemeiner Standard, der sich auch aus der linearen Notation von Pgmmier­Sprachen ergibt. In mathe­matischer (linear-algebraischer) Notation wdn die Elemente eines horizontal gerichteten Vektors auch horizontal, die eines vertikal gerichteten vertikal geklammert aufgeführt. Die Xl-Fkt MMULT würde auch nur so ein (sinnvolles) Ergebnis aus 2 Vektoren liefern:
hVektor B1:D1: {1.2.3} — vVektor A2:A4: {4;5;6}
Ergebnismatrix B2:D4: {=MMULT(A2:A4;B1:D1)} ⇒ {4.8.12;5.10.15;6.12.18}
Das muss man natürlich auch bei Verwendung der WorksheetFunction.MMult berücksichtigen.
Ansonsten kann man natürlich auch in VBA einen 2dimensionalen horizontalen Vektor deklarieren, aber das ist eben nicht der VBA-Standard.
Die anwenderfreundliche automatische Transformation würde ich dann eher für die ListBox annehmen, so wie Xl dann auch mit von UDFs erzeugten Datenfeldern der Form vVektor aus hVektoren anwender­freundlich verfährt, was VBA nicht automatisch macht. Dafür könnte/müsste man dann erst noch die WorksheetFunction.Transpose 2× einsetzen.
Gruß, Luc :-?
Anzeige
AW: Mehrere Spalten in Array speichern
12.10.2016 09:29:26
baschti007
Hey Ho
Du musst das so machen
Gruß Basti

Sub Array2D()
Arr = WorksheetFunction.Transpose(ActiveSheet.Range("A1:B4"))
For r = LBound(Arr, 2) To UBound(Arr, 2) ' Row
For c = LBound(Arr, 1) To UBound(Arr, 1) ' column
Debug.Print Arr(c, r)
Next
Next
End Sub

AW: Mehrere Spalten in Array speichern
12.10.2016 11:56:00
Daniel
Hi
wenn das Ergebnis des Transponierens ein 2-D-Array mit nur einer Zeile ist, dann wandelt das Transponieren dieses 2-D-Array in ein 1-D-Array um.
wenn du also einen Zellbereich, der aus einer Spalten und mehreren Zeilen besteht, in ein 1-D-Array wandeln willst, reicht einmaliges Transponieren
Arr = Worksheetfunction.Transpose(Range("K4:K10000").value)
wenn du einen Zellbereich, der aus einer Zeile und mehreren Spalten besteht, in ein 1-D-Array wandeln willst, musst du 2x transponieren, weil beim ersten Transponieren ja ein Array mit mehren Zeilen entsteht, welches ein 2-D-Array bleibt.
Arr = Worksheetfunction.Transpose(Worksheetfunction.Tanspose(Range("K4:N4").value))
wenn du alle Werte eines Zellbereiches, der aus mehreren Zeilen und mehreren Spalten besteht in ein eindimensionales Array überführen willst, dann müsstest du das in einer Schleife machen:
dim Wert
dim arr
dim i as Long
redim arr(1 to Range("K4:N1000").Cells.count)
for each Wert in range("K4:N10000").value
i = i + 1
arr(i) = Wert
Next

Anzeige
AW: Mehrere Spalten in Array speichern
12.10.2016 11:58:38
Daniel
das transponieren kann einen Zellbereich, der aus mehreren Zeilen und mehreren Spalten besteht, nicht in ein 1-D-Array überführen.
das Ergebnis bleibt ein 2-Array, nur jetzt nicht mit 4 Spalten und 9997 Zeilen, sondern mit 9997 Spalten und 4 Zeilen.
Gruß Daniel
AW: Mehrere Spalten in Array speichern
12.10.2016 13:01:43
herman
Danke an alle, funktioniert einwandfrei
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige