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

Nachhilfe in Arrays

Nachhilfe in Arrays
19.08.2021 09:20:51
PeTeR
Guten Morgen VBA-Spezialisten,
ich brauche bitte Nachhilfe bei Arrays:
Ein Array soll mit 4 Spalten einer Tabelle gefüllt werden vARR=range("A3:D3").value - Damit ist die 1. Zeile im Array gefüllt :-)
ABER wie fülle ich nun die 2. Zeile im Array mit z.B. A7:D7?
Vielen Dank für Eure Unterstützung!
VG
PeTeR

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Nachhilfe in Arrays
19.08.2021 10:59:39
Daniel
Hi
Die Excelautomatik unterstützt nur das übertragen von lückenlosen, rechteckigen Zellbereichen in 2-dimensionale Arrays.
Du müsstest hier selber alles programmieren, ggf mit Schleife unterstützt:

dim arr(1 to 2, 1 to 4)
Dim zE, zA, s
For each zE in Array(3, 7)
zA = zA + 1
For s = 1 to 4
arr(zA, s) = Cells(zE, s).value
Next
Next
Oder du kopierts die Liste in ein neues Blatt, löschst die nicht benötigten Zeilen und übernimmst den Rest ins Array.
Gruß Daniel
AW: Nachhilfe in Arrays
19.08.2021 12:38:55
PeTeR
Hallo Daniel,
vielen Dank für deine Unterstützung! Das hatte ich schon vermutet und befürchtet - aber damit komme ich jetzt klar.
VG
PeTeR
Anzeige
Alternative Lösungen
21.08.2021 03:28:48
Luc:-?
Morhn, Peter;
man kann auch eine andere Art von Array wählen, die von Xl bei Verwendung in einer UDF in einer ZellFml automatisch in ein klassisches 2dimensionales umgewandelt wird. Bei Verwendung in einer SubProzedur müsste das allerdings per WorksheetFunction.Index geschehen, bevor ein solches Array auf ein Xl-Blatt übertragen wdn kann. Ich zeige das nfolgd mal anhand von Fktsprozeduren (UDF).
Für dein einfaches Bsp würde Folgendes ausreichen:

Function diskBerInArr(Bereich As Range)
Dim ax As Long, ar, arBer
ReDim arBer(Bereich.Areas.Count - 1)
For Each ar In Bereich.Areas
arBer(ax) = ar: ax = ax + 1
Next ar
diskBerInArr = arBer
End Function
Plurale MatrixFml: {=diskBerInArr((A3:D3;A7:D7))}
Würde es etwas anspruchsvoller und der diskontinuierliche Bereich bestünde aus mehreren kontinuierlichen mit ggf unterschiedlicher ZeilenAnzahl, käme Folgendes infrage:

Function diskBerRowsInArr(Bereich As Range)
Dim ax As Long, rx As Long, arBer, ar As Range, arr As Range
ReDim arBer(0)
For Each ar In Bereich.Areas
ReDim Preserve arBer(ax + ar.Rows.Count - 1)
For Each arr In ar.Rows
arBer(ax) = arr: ax = ax + 1
Next arr
Next ar
diskBerRowsInArr = arBer
End Function
Plurale MatrixFml -einf: {=diskBerRowsInArr((A3:D3;A7:D7))} -kompl: {=diskBerRowsInArr((A3:D5;A7:D8))}
Allerdings sollte bei beiden Varianten die Anzahl der Spalten der TeilBereiche einander gleich sein, sonst ergäbe das Ergebnis-Array keine allein darstellbare rechteckige Matrix. Diese müsste durch entsprd Normierung erreicht wdn. Allerdings könnte man im Fall der reinen zusammengefassten Übertragung auf einen ZellBereich auch gleich eine plurale INDEX-MatrixFml benutzen:
• Fall1 (einfach): {=INDEX((A3:D3;A7:D7);1;SPALTE(A:D);ZEILE(1:2))}
• Fall2 (2-/1zeilig): {=INDEX((A3:D4;A7:D7);{1;2;1};SPALTE(A:D);{1;1;2})}
Leider lässt sich deren Ergebnis nicht 1:1 in einer VBA-Prozedur erzielen, weil der FmlText-Interpreter im Falle von INDEX im Xl-Blatt offensichtlich mehr zum Ergebnis beiträgt als selbst mit der vbFkt Evaluate erreichbar wäre. Folglich kommt man auch hierbei nicht um zyklische Pgmmierung herum wie nFolgd gezeigt:

Function diskBerEvIxArr(Bereich As Range, Optional ByVal TeilBerNr = 1)
Dim ax As Long, ix As Long, rc As Long, rx As Long, ar, arBer
If IsArray(TeilBerNr) Then
ReDim arBer(1 To WorksheetFunction.Count(TeilBerNr))
For Each ar In TeilBerNr
rc = Bereich.Areas(ar).Rows.Count
If rc > 1 Then
rx = rx + 1: ix = ix + 1
arBer(ix) = Evaluate("Index((" & Bereich.Address & ")," & rx & ",0," & ar & ")")
Else: arBer(ar) = Evaluate("Index((" & Bereich.Address & "),1,0," & ar & ")")
End If
rx = rx Mod rc
Next ar
Else: arBer = Evaluate("Index((" & Bereich.Address & "),1,0," & TeilBerNr & ")")
End If
diskBerEvIxArr = arBer
End Function
Plurale MatrixFml -einf: {=diskBerEvIxArr((A3:D3;A7:D7);{1;2})} -kompl: {=diskBerEvIxArr((A3:D5;A7:D8);{1;1;1;2;2})}
Das ist nur eine weitere universellere (Fall2) Möglichkeit. Man könnte auch mit WorksheetFunction.Index und ohne 2.Argument der Fkt arbeiten, was eleganter wäre, aber höheren PgmmierAufwand nebst komplizierterer ZyklenRegie erforderte. Aber das kannst du ggf ja selbst erkunden.
Gruß, Luc :-?
„Die universelle Befähigung zur Unfähigkeit macht jede menschliche Leistung zu einem unglaublichen Wunder.“ Stapps ironisches Paradoxon
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige