Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
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
2 Dimensionales Array
16.10.2016 16:42:45
Bastian
Halli Hallo
Da ich heute wohl etwas durch einander bin frag ich mal nach =)
Wie bekomme ich aus der rng ein 2D array

Rng = WorksheetFunction.Transpose(Range("A1:A3,C1:D3").Value)

Gruß Basti

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 2 Dimensionales Array
16.10.2016 17:27:57
Michael
Hi Basti,
ein Array kann nur ein zusammenhängender Bereich sein, d.h. aus A1:A3 und C1:D3 bekommst Du kein Array.
Entweder Du nimmst
Dim a as Variant
a=range("A1:D3") und benutzt die (ursprüngliche) Spalte B nicht oder
Dim a as Variant, b as Variant
a=range("A1:A3").Value
b=range("C1:D3").Value
wobei die untere Variante flexibler beim Zurückschreiben ins Tabellenblatt ist.
Während der Berechungen ist es egal, ob das Array transponiert ist oder nicht: das regelst Du ggf. über die Reihenfolge der verwendeten Laufvariablen.
Übrigens hat das .Value in der von Dir zitierten Zeile nix zu suchen: .Value sind Werte, aber links steht dem Namen nach ein Range-Objekt.
Hilft Dir das?
Schöne Grüße,
Michael
Anzeige
AW: 2 Dimensionales Array
16.10.2016 18:07:53
Bastian
Hey Danke =) Michael
Ich habe mir schon soetwas gedacht
Schönen Sonntag noch
Gruß Basti
AW: 2 Dimensionales Array
16.10.2016 18:44:56
Michael
Hi,
wenn Du eine Beispieldatei mit Beschreibung hochlädst, kann Dir einer von uns sicher schnell ein paar Zeilen Code dazu stricken.
Also: Daniel wahrscheinlich, hehe, weil ich für heute weg bin...
Schöne Grüße,
Michael
Deine '.Value' betreffende Aussage ist falsch, ...
16.10.2016 19:25:01
Luc:-?
Michael,
ein Range-Objekt hat die Eigenschaft Value, es ist sogar seine Default-Eigenschaft bei Wiedergabe, denn ein Objekt kann nur referenziert, nicht „wiedergegeben“ wdn. Transpose erzeugt ohnehin ein Array aus Werten, nicht aus Objekt­Bezügen, also ist die Value-Angabe nicht falsch, sondern nur überflüssig. Ein diskreter Bereich kann allerdings nicht transponiert wdn.
Dein Fall liegt allerdings noch recht günstig, Basti,
und könnte per Fml mit INDEX in eine zusammen­hängende Datenfeld­Matrix transferiert wdn:
A5:C7: {=INDEX((A1:A3;C1:D3);ZEILE(1:3);{1.1.2};{1.2.2})}
In diesem einfachen Fall fktioniert dann sogar das Transponieren:
A10:C12: {=MTRANS(INDEX((A1:A3;C1:D3);ZEILE(1:3);{1.1.2};{1.2.2}))}
Das könntest du zwar auch mit WorksheetFunction.Index probieren, aber es steht zu befürchten, dass das so nicht fktio­niert, weil die Unter­stützung durch die Xl-Steuerung in VBA normaler­weise nicht gegeben und auch mit vbFkt Evaluate hier nicht zu erreichen ist, weil/wenn die benötigte Zell­Auswahl für das Ergebnis fehlt.
Mit VBA könntest du aber mit UDF so vorgehen, falls es sich um Zahlen handelt (als ZellFml dar­gestellt):
E5:G7: {=VSplit(A1:A3&" "&C1:C3&" "&D1:D3;;1)} bzw
E10:G12: {=MTRANS(VSplit(A1:A3&" "&C1:C3&" "&D1:D3;;1))}
Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Deine '.Value' betreffende Aussage ist falsch, ...
16.10.2016 19:45:29
Bastian
Oh Luc Danke für diese Ausfühliche beschreibung =)
Ich werde alles mal Testen und hoffe dadurch mein Wissen zu steigern ;)
Gruß Basti
Schönen Sonntag Abend dir noch =)
AW: 2 Dimensionales Array
16.10.2016 17:45:15
Daniel
Hi
wie schon gesagt wurde, ein 2D-Array hat keine Lücken, daher kann man nur einen rechteckigen Range ohne Lücken in ein Array überführen.
Versuchst du dass mit einem Range mit Lücken, dann wird nur der erste Block ins array übernommen, also nur das "A1:A3"
ansonsten würden sich folgende Fragen stellen, wenn du einen aus mehrern Blöcken bestehenden Bereich in ein 2-D-Array überführen wolltest:
1. was soll mit den Lücken geschen? sollten diese als Leerwerte in im Array erhalten bleiben oder sollen die Lücken geschlossen werden?, dh soll aus deiner Range ein 3x4 Array werden bei dem die 2. Spalte leer ist oder soll ein 3x3 Array daraus werden?
2. was sollte passieren, wenn die Zeilen in den Blöcken unterschiedlich sind, also nicht immer 1 und 3, sondern z.B. Range("A1:A3;C3:D6")
Gruß Daniel
Anzeige
AW: 2 Dimensionales Array
16.10.2016 18:10:37
Bastian
Hallo Daniel
1.Es soll keine Lücke geben die(geschlossen werden)
2. diese sind immer Gleich Lang
Ich werde noch mal etwas rum tüfteln =D also mit diesen 2D array komm ich irgenwie nicht klar muss wohl am Sonntag liegen sonst stell ich mich eigendlich nicht so dumm an .
Schönen Sonntag dir noch
Gruß basti
AW: 2 Dimensionales Array
16.10.2016 19:07:38
Daniel
Hi
wenn du eine "Lücken-Range" in ein 2D-Array übernehem willst, ist der einfachste Weg folgender:
1. kopiere die "Lücken-Range" und füge sie an einer freien Stelle wieder ein.
Beim Einfügen schießt Excel die Lücken.
2. übernehme dann den eingefügten Bereich ins Array
dh in etwa so:
Range("A1:A3,C1:D3").Copy
Range("x1").PasteSpecial xlpastevalues
Arr = Range("X1").CurrentRegion.Value
Range("x1").CurrentRegion.ClearContents

wenn du es per Makro machen willst, müssest du erstmal ermitteln, wie groß das Zielarray werden wird und dann per Schleife jeden Wert einzeln aus der Range ins Array übertragen.
dabei brauchst du im Prinzip 3 ineinander geschachteltet Schleifen:
1. eine Schleife über alle Blöcke der Range (die Blöcke sind die Lückenlosen, rechteckigen Zellbereiche aus denen die gesamtrange zusammengesetzt ist)
2. eine Schleife über die Spalten des Blocks
3. eine Schleife über die Zeilen des Blocks:
Dim ARR
Dim Block As Range, BL
Dim z As Long
Dim sBlock As Long
Dim sArr As Long
Dim Zeilen As Long, Spalten As Long
Set XXX = Range("A1:A3,C1:D3")
ReDim ARR(1 To XXX.Rows.Count, 1 To Intersect(XXX, Rows(1)).Cells.Count)
For Each Block In XXX.Areas
BL = Block.Value
For sBlock = 1 To UBound(BL, 2)
sArr = sArr + 1
For z = 1 To UBound(BL, 1)
ARR(z, sArr) = BL(z, sBlock)
Next
Next
Next
Gruß Daniel
Anzeige
AW: 2 Dimensionales Array
16.10.2016 19:44:08
Bastian
Hey Danke =) das Erste mit dem Kopieren habe ich auch schon gemacht zwar nicht mit Copy aber so in der art.
Set Rng = Range("A1:A3,C1:D3")
Range("A10").Resize(Rng.Rows.Count, Rng.Areas(1).Columns.Count + Rng.Areas(2).Columns.Count) =  _
WorksheetFunction.Transpose(Rng.Value)
Super und das andere guck ich mir mal an Danke =)
Gruß Basti
AW: 2 Dimensionales Array
17.10.2016 07:53:49
baschti007
Hey Daniel Ich glaube ich habs nun gerallt =D
Oder gibt es noch eine einfacherer Lösung ?

Sub sdds()
Dim arr
Dim rng As Range, CcountArea As Range
Dim a As Long, r As Long, c As Long, Carr As Long, Ccount As Long, Rcount As Long
Set rng = Range("A1:A3,C1:D3,F1:F3")
For Each countArea In rng.Areas
Ccount = Ccount + countArea.Columns.Count
If countArea.Rows.Count > Rcount Then Rcount = countArea.Rows.Count
Next
ReDim arr(1 To Rcount, 1 To Ccount)
For r = 1 To Rcount
For a = 1 To rng.Areas.Count
For c = 1 To rng.Areas(a).Columns.Count
Carr = Carr + 1
Debug.Print rng.Areas(a).Cells(r, c)
arr(r, Carr) = rng.Areas(a).Cells(r, c)
Next
Next
Carr = 0
Next
With Me.ListBox1
.Clear
.ColumnCount = Ccount
.List = arr
End With
End Sub
Gruß Basti
Anzeige
AW: 2 Dimensionales Array
17.10.2016 08:23:13
Daniel
Hi
ja klar gibt's nen einfacheren Weg und diesen Weg habe ich auch in meiner Antwort als ersten benannt:
den Zellbereich mit Lücken kopieren und an einer anderen Stelle einfügen.
Dabei werden, die Lücken automatsich geschlossen und du kannst den eingefügten Zellbereich direkt mit arr = Range().value in ein 2D-Array übernehmen.
obs noch andere einfache Lösungen gibt, will ich nicht ausschließen, aber mir fällt spontan keine ein.
Gruß Daniel
AW: 2 Dimensionales Array
17.10.2016 09:26:17
baschti007
Ok =) Danke
Nun meine Letzte Frage zum Thema Array
Wie kann ich einen bestimmten Bereich eines Array ausgeben lassen zb.
Nur Spalte 1 bis 2 oder nur zeile 2 bis 3
mit index.(aar,1) order index.(aar,0,1) bekommt man ja nur eine Zeile oder Spalte
Gruß Basti
Anzeige
AW: 2 Dimensionales Array
17.10.2016 09:42:50
Daniel
Hi
Werte einzeln per Schleife übertragen.
Wenn die Werte auch auf einem Tabellenblatt liegen, könntest sie dort auch einfach aus dem entsprechenden Zellbereich abgreifen.
Gruß Daniel
AW: 2 Dimensionales Array
17.10.2016 10:03:57
baschti007
Ah Ok ich Dachte =) ich dachte da gäbe es was anderes ohne schleife .
Vielen Dank dir
SChöne Woche noch .
Gruß Basti
AW: 2 Dimensionales Array
17.10.2016 11:00:52
Daniel
Hi
bei Arrays braucht man sich vor Schleifen nicht scheuen.
wenn du ein Array transponieren willst, ist
redim arr2(1 to ubound(arr1, 2), 1 to ubound(arr1, 1))
For x = 1 to Ubound(arr1, 1)
For y = 1 to Ubound(arr1, 2)
arr2(y, x) = arr1(x, y)
Next
next
nicht nur viel schneller als
arr2 = Worksheetfunction.Transpose(arr1)

sondern es verkraftet auch grössere Datenmengen.
Gruß Daniel
Anzeige
AW: 2 Dimensionales Array
17.10.2016 20:08:13
Bastian
Ah Cool Daniel ich dachte immer das die Transpose schneller sein würde.
Danke =)
2 Dimensionales Array - Variante
17.10.2016 15:02:46
Michael
Hi zusammen,
ich hatte es mir etwa so gedacht:
Sub sdds_Michael()
Dim arrIn, arrOut, nurDie
Dim r As Long, c As Long
nurDie = Array(0, 1, 3, 4, 6) ' A, C, D, F
' das ist ein 0-basiertes Array, der erste Wert wird übergangen
arrIn = Range("A1:F3")
ReDim arrOut(1 To UBound(arrIn), 1 To UBound(nurDie))
For c = 1 To UBound(nurDie)
For r = 1 To UBound(arrIn)
arrOut(r, c) = arrIn(r, nurDie(c))
Next
Next
Range("G10").Resize(UBound(arrOut), UBound(arrOut, 2)) = arrOut
'With Me.ListBox1
'.Clear
'.ColumnCount = Ccount
'.List = arr
'End With
End Sub

wobei die Ausgabe zum Test im Tabellenblatt erfolgt; die Zeile dann bitte auskommentieren und das With "entkommentieren".
So nudelt Excel nicht mit Bereichen herum, sondern pickt sich aus dem kompletten Array (arrIn) die benötigten Daten raus und schreibt sie in arrOut.
Schöne Grüße,
Michael
Anzeige
AW: 2 Dimensionales Array - Variante
17.10.2016 15:33:19
baschti007
hey Michael auch eine nette Lösung =)
Danke Gruß basti
gerne
18.10.2016 17:47:56
Michael
Hi,
ich mache mir bei so Sachen immer wieder mal - wenn es um viele Daten geht und zeitkritisch ist - eine Testtabelle mit ein paar 1000 Spielwerten und einer Zeitmessung.
Ein Beispiel dazu ist gerade offen: https://www.herber.de/forum/messages/1520209.html
Ansonsten danke für die Rückmeldung & Gruß,
Michael

48 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige