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

komplettes Array in Bereich schreiben

komplettes Array in Bereich schreiben
28.01.2019 19:16:44
Oisse
Hallo Zusammen,
mir stellt sich folgendes Problem:
In einer Tabelle habe ich mehrere Gewerke, die aus mehreren Zeilen bestehen.
Bspw. Gewerk1("A1:C10"); Gewerk2("A11:C15"); Gewerk3("A16:C22") usw. Die Gewerke haben also unterschiedliche Zeilenanzahlen.
Nun geht es darum, diese Gewerke umzusortieren, sodass das, was in Gewerk1 steht nun bspw. in Gewerk steht und umgekehrt.
Die einzelnen Gewerke lese ich bereits sortiert, so wie sie später ausgegeben werden sollen, in ein Array ein.
Es sind 13 Gewerke mit ungefähr 76 Zeilen und 22 Spalten
Der entscheidende Codeteil zum Einlesen ins Array sieht so aus:

For b = LBound(ArrGew) To UBound(ArrGew)
For i = ZeileGewerk To ZeileNäGewerk - 1
With wks_Zeitplan
ArrNeu(a) = .Range(.Cells(ZeileGewerk, 1), .Cells(ZeileNäGewerk - 1, ls) _
)
End With
Next i
a = a + 1
Next b

Wie bitte muss der Code aussehen, damit ich die Werte wieder zurückgeschrieben bekomme.
Dabei möchte ich mit Zeile 11 starten.
Mit folgender Zeile funktioniert es leider nicht:
wks_Zeitplan.Range(.Cells(11, 1), .Cells(lz_Zeitplan - 3, ls)) = ArrNeu

Danke schon mal für eure Hilfe.
Gruß Oisse

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

Betreff
Datum
Anwender
Anzeige
AW: komplettes Array in Bereich schreiben
28.01.2019 19:30:33
Nepumuk
Hallo Oisse,
im Prinzip so:
wks_Zeitplan.Cells(11, 1).Resize(UBound(ArrNeu) + 1, 1) = Application.Transpose(ArrNeu)

Ich bin davon ausgegangen, dass das Array 0-basiert ist. Sollte der kleinste Index 1 sein, dann musst du das + 1 in der Zeile löschen.
Gruß
Nepumuk
AW: komplettes Array in Bereich schreiben
28.01.2019 19:49:58
Oisse
Hallo Nepomuk,
und danke für die Antwort.
Es kommt aber die Fehlermeldung '13
"Typen unverträglich"
Das Array ist wie folgt dimensioniert:
Dim ArrNeu As Variant
Muss ich da was ändern oder warum kommt der Fehler?
Gruß Oisse
AW: komplettes Array in Bereich schreiben
28.01.2019 19:59:28
Nepumuk
Hallo Oisse,
zeig mal die ganze Prozedur.
Gruß
Nepumuk
Anzeige
AW: komplettes Array in Bereich schreiben
28.01.2019 20:04:25
Oisse
Hier also die Prozedur:
Sub Ausblenden_Zeilen()
Dim wkb As Workbook
Dim wkb_Zeitplan As Workbook
Dim wks_Bauhelferliste As Worksheet
Dim wks_Zeitplan As Worksheet
Dim wks_Uebersicht As Worksheet
Dim lz_Zeitplan As Long
Dim lz_Gewerk As Long
Dim ArrGew()
Dim ArrNeu As Variant
Dim myControl As Control
Dim Distanz As Long
Dim y As Long
Dim a As Long
Dim b As Long
Dim i As Long
Set wkb = ThisWorkbook
Set wks_Uebersicht = wkb.Worksheets("Uebersicht")
Set wks_Zeitplan = wkb.Worksheets("Bauplanung_" & Left(wks_Uebersicht.Range("B1"), 9))
Set scrDic = CreateObject("Scripting.dictionary")
lz_Zeitplan = wks_Zeitplan.Cells(Rows.Count, 1).End(xlUp).Row
lz_Gewerk = wks_Uebersicht.Cells(Rows.Count, 2).End(xlUp).Row
ls = wks_Zeitplan.Cells(3, Columns.Count).End(xlToLeft).Column
'Start in der Gewerkeliste in der ?bersicht ermitteln
For i = 1 To lz_Gewerk
With wks_Uebersicht
If .Range("B" & i) = "Gewerk" Then
StartGew = .Range("B" & i).Row + 1
End If
End With
Next i
y = 0
With wks_Uebersicht
wks_Uebersicht.Activate
.Range("A" & StartGew & ":D" & lz_Gewerk - 1).Sort _
Key1:=.Range("D" & StartGew + 1), Order1:=xlAscending, _
Header:=xlYes
For i = StartGew To lz_Gewerk
If .Range("D" & i)  "" Then   'Ermitteln wieviele Gewerke ausgew?hlt sind
y = y + 1
End If
Next i
End With
ZeilenArr = 0
'Array mit den Gewerken aus der ?bersicht f?llen, wird zum Vergleichen gebraucht, ob in der  _
Zeitplanspalte Spalte A der Eintrag mit der Liste ?bereinstimmt
ReDim ArrGew(y - 1, 0)
ReDim ArrNeu(y - 1)
x = 0
For i = StartGew To StartGew + y - 1
ArrGew(x, 0) = wks_Uebersicht.Range("B" & i)
x = x + 1
Next i
'Hier startet das Ermitteln des Beginns und Endes eines Gewerkes
For b = LBound(ArrGew) To UBound(ArrGew)
For i = 10 To lz_Zeitplan - 3
'For x = LBound(ArrGew) To UBound(ArrGew)
With wks_Zeitplan
If .Cells(i, 1) = ArrGew(b, 0) Then
ZeileGewerk = i
GoTo GewerkAnfang
End If
End With
'Next x
Next i
GewerkAnfang:
With wks_Zeitplan
'Gewerk durchsuchen
For x = ZeileGewerk + 1 To lz_Zeitplan - 3
If x = lz_Zeitplan - 3 Then
ZeileN?Gewerk = x
GoTo GewerkEnde
End If
For n = LBound(ArrGew) To UBound(ArrGew)    'Pr?fen ob in der  _
Zelle tats?chlich das Gewerk drin steht
If .Range("A" & x) = ArrGew(n, 0) Then
ZeilenN?chstesGewerk = .Range("A" & x).Row
N?Gewerk = ArrGew(n, 0)
ZeileN?Gewerk = x
GoTo GewerkEnde
End If
Next n
Next x
End With
GewerkEnde:
For i = ZeileGewerk To ZeileN?Gewerk - 1
With wks_Zeitplan
ArrNeu(a) = .Range(.Cells(ZeileGewerk, 1), .Cells(ZeileN?Gewerk - 1, ls) _
)
End With
Next i
a = a + 1
Next b
i = 11
With wks_Zeitplan
.Activate
.Range(.Cells(11, 1), .Cells(lz_Zeitplan - 3, ls)).ClearContents
.Cells(11, 1).Resize(UBound(ArrNeu) + 1, 1) = Application.Transpose(ArrNeu)
End With
End Sub

Anzeige
AW: komplettes Array in Bereich schreiben
28.01.2019 20:10:46
Nepumuk
Hallo Oisse,
kann es sein dass dein Array leer ist? Das würde den Fehler erklären. Das könnte ich abfangen.
Gruß
Nepumuk
AW: komplettes Array in Bereich schreiben
28.01.2019 20:27:46
Oisse
Nein, das Array ist gefüllt, sieht allerdings so aus:
ArrNeu
ArrNeu(0)
ArrNeu(0)(1)
ArrNeu(0)(1,1) "Gewerkname"
ArrNeu(0)(1,2) Leer
.
.
+ArrNeu(0)(2)
.
.
Kannst du damit was anfangen?
AW: komplettes Array in Bereich schreiben
28.01.2019 20:55:12
Nepumuk
Hallo Oisse,
du weißt den einzelnem Arrayindizes einen Bereich zu und das mehrfach auf den selben Index. Da stimmt was nicht. Kontrolliere und korrigiere das mal. Dann reden wir weiter.
For i = ZeileGewerk To ZeileNxGewerk - 1
    With wks_Zeitplan
        ArrNeu(a) = .Range(.Cells(ZeileGewerk, 1), .Cells(ZeileNxGewerk - 1, ls))
    End With
Next i

In der Schleife For i = ... wird dem Array mehrfach auf dem selben Index ein Wert zugewiesen.
Gruß
Nepumuk
Anzeige
AW: komplettes Array in Bereich schreiben
28.01.2019 21:18:02
Oisse
Danke für den Hinweis,
Daniel hat auch darauf hingewiesen.
Wenn ich die For-Schleife weglasse, bekomme ich das gleiche Ergebnis. Das Array sieht wieder genauso aus.
Und ich weiß nicht wie ich das korrigieren kann.
Gruß Oisse
AW: komplettes Array in Bereich schreiben
28.01.2019 20:58:50
Daniel
Hi
das Problem ist, dass du eigentlich nur zweidimensionale Arrays in ein Tabellenblatt zurückschreiben kann.
Eindimensionale Arrays kann VBA entsprechend umwandeln, wenn besimmte Anforderungen erfüllt sind.
das Problem an der Sache ist dass das konstrukt dass du erstellst, ein eindimensionales Array ist (ArrNeu(a)) dem du aber an jedem Index keinen Einzelwert zuweist, sondern wieder ein zweidimensionales Array (Range(...)), damit ist das gesamtkonstrukt im prinzip dreidimensional!
wenn du dir das vorstellen willst, vielleicht so:
- ein Einzelwert ist eine Perle
- ein 1-d-Array ist eine Perlenschnur
- ein 2-d-Array ist ein Perlenteppich
- ein 3-d-Array ist ein Perlenwürfel
du erstellst dir eine Perlenschnur, bei der anstelle jeder einzelnen Perle ein ganzer Teppich hängt.
so ein konstrukt kann nicht mehr automatsich in ein 2-D-Array gewandelt werden.
hier musst du dir selber eine Schleife schreiben, die dir deinen Würfel in einen Teppich umbaut.
Gruß Daniel
Anzeige
AW: komplettes Array in Bereich schreiben
28.01.2019 21:13:19
Oisse
Hallo Daniel,
danke für die Erklärung, wenngleich ich jetzt nicht weiß, wie ich das lösen soll.
Dass der Fehler schon in der Konstruktion liegt, ist mir jetzt klar, aber wie ich meine Bereiche sortiert bekomme, eingelesen und entsprechend ausgegeben, noch nicht.
Du hast einen 2stufigen Tensor konstruiert, ...
28.01.2019 23:04:07
Luc:-?
…Oisse,
dessen 1.Stufe 1- ([vertikal gerichteter] Vektor) und dessen 2.Stufe 2dimensional* (Matrix) ist. So etwas kann Xl auf keinen Fall in Gänze auf ein TabBlatt abbilden. Hier müsstest du jede Matrix einzeln auf einen jeweils anderen ZellBereich ausgeben.
Das Gleiche träfe auch zu, wenn die 2.Stufe ein (horizontal gerichteter) Kovektor wäre. Wären dann alle Kovektoren gleich lang, könnte Xl das Ganze in eine Matrix umwandeln, aber nur in einer ZellFml, nicht, wenn eine SubProzedur das in Gänze in einen ZellBereich schreiben wollte. Dann fehlt nämlich diese Xl-Unterstützung.
Falls es sich bei den Matrizen tatsächlich um echte (mit mehreren Zeilen und Spalten) und nicht um die xl-übliche 2d-Darstellung von (Ko-)Vektoren handeln sollte, könnte man trotzdem alles auf 1× ausgeben, wenn man zuvor jede Matrix in eine MatrixKonstante (als Text) umwandelt. Um solche Ergebnisse in reguläre größere Matrizen umzuwandeln, existiert im Archiv eine Fkt (UDF; RECHERCHE über 3-/4-Tensor). Anderenfalls kannst du die einzelnen Matrizen auch nacheinander in bestimmte, dafür reservierte Bereiche einer größeren Matrix eintragen, so wie das auch beim Kronecker-Tensor-Produkt gehandhabt wird (nur dass die Multiplikation entfällt).
* Das ist eine Mischform aus Variant- und VBA-Array. Echte mehrstufige Tensoren bestehen nämlich nur aus Vektoren und Kovektoren und allenfalls ihren skalaren Varianten [Tensor(0,0)].
Gruß, Luc :-?
Anzeige
AW: Du hast einen 2stufigen Tensor konstruiert, ...
29.01.2019 12:10:46
Oisse
Hallo Luc,
und danke für Deine super Erklärung, wenngleich ich sagen muss, dass mir das zu hoch ist.
Nun habe ich aber das Ganze mit Schleifen gemacht, ist zwar sehr umständlich und langsam aber es funktioniert.
Vielen herzlichen Dank also nochmal.
Gruß Oisse
AW: komplettes Array in Bereich schreiben
28.01.2019 23:08:17
Daniel
Hi
im Prinzip so (Code nur prinzipiell, also bitte nicht kopieren, sondern verstehen und selber  _
schreiben)
hierbei werden die einzelnen Teil-Teppiche zu einem Gesmatteppich verwoben, wobei die  _
Zeilennummer es Gesamtteppichs immer weiter hochgezählt wird.
Die benötigte Anzahl an Zeilen und Spalten für den Gesamtteppich solltest du vorher schon  _
kennen um diesen entsprechend dimensionieren zu können.
dim arrErg(1 to Zmax, 1 to Smax)
dim arrX
dim zX as long, zErg as long
dim s as long
for a = LBound(ArrNeu) to Ubound(ArrNeu)
arrX = ArrNeu(a)
for zX = Lbound(arrX, 1) to Ubound(arrX, 1)
zErg = zErg + 1
for s = Lbound(arrX, 2) to Ubound(arrX, 2)
arrErg(zErg, s) = arrX(zX, s)
Next s
next zX
next a
Cells(..).Resize(ubound(ArrErg, 1), Ubound(arrErg, 2)) = arrErg
Gruß Daniel
Anzeige
AW: komplettes Array in Bereich schreiben
29.01.2019 07:15:55
Nepumuk
Hallo,
so ein Array lässt sich schon ohne Umweg in einen Range schreiben. Beispiel:
Public Sub test()
    Dim avntArray As Variant
    avntArray = Array(Array(1, 2, 3), Array(4, 5, 6), _
        Array(7, 8, 9), Array(10, 11, 12))
    Cells(1, 1).Resize(UBound(avntArray(0), 1) + 1, _
        UBound(avntArray, 1) + 1).Value = Application.Transpose(avntArray)
End Sub

Voraussetzung ist, dass das Array im Array immer die selben Dimensionen hat.
Gruß
Nepumuk
Anzeige
AW: komplettes Array in Bereich schreiben
29.01.2019 12:19:30
Oisse
Hallo Nepumuk
und viielen herzlichen Dank, dass Du Dir so viel Mühe mit meinem Problem gemacht hast. Wie Du mir geschrieben hattest, sollte ich erst mal mein "Konstrukt" ändern und deshalb bin ich auf Schleifen umgestiegen, die mir Zelle für Zelle aus dem Array in die Tabelle überträgt. Läuft zwar langsam, aber es läuft (zumindest vorerst mal so). Ich denke, ich werde nochmal daran basteln.
Bis dahin.
Herzliche Grüße
Oisse
AW: komplettes Array in Bereich schreiben
29.01.2019 13:51:20
Daniel
Hi
und meine Schleife schreibt halt Wert für Wert erstmal in ein Zwischenarray und dann das ganze Array in einem Schritt zurück in die Zellen.
Das ist dann etwas schneller als jede Zelle einzeln zurückschreiben.
alternativ kannst du auch jeden Block als ganzes in den Zellbereich zurückschreiben:
(Startindex 1 bei Arrays angenommen)

dim arr
dim i as Long
i = 11 'StartZeile
for each arr in arrNeu
Cells(i, 1).Resize(ubound(arr, 1), ubound(arr, 2)) = arr
i = i + Ubound(arr, 1)
Next
Gruß Daniel
Anzeige
Hier ersetzt die Xl-Fkt MTRANS (Transpose) ...
29.01.2019 14:14:54
Luc:-?
…quasi die Fktionalität des Xl-FmlText-Interpreters, so dass im Falle gleicher KovektorLängen (jeder Kovektor ein Element des Hpt-Vektors) eine regulär rechteckige Matrix durch MTRANS erzeugbar ist. Das wäre bei echten Matrizen als Elemente des Hpt-Vektors so nicht möglich.
Man kann auch ungleichlange Kovektoren so behandeln, wenn man ihre Längen zuvor normiert, d.h., alle auf die gleiche (Maxi­mal)­Länge bringt.
Gruß, Luc :-?
AW: komplettes Array in Bereich schreiben
29.01.2019 12:13:44
Oisse
Hallo Daniel,
und auch Dir herzlichen Dank.
Dein Codebeispiel werde ich mir auf alle Fälle zu Gemüte führen, auch wenn ich es jetzt (wohl vorerst) mal mit Schleifen gelöst habe.
Gruß Oisse
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige