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

Array Zeile in anderes Array einlesen.

Array Zeile in anderes Array einlesen.
30.07.2017 08:41:19
Kailash
Hallo Excel Freunde!
Wie kann man bei einem Array mit mehreren Spalten eine ganze Zeile in ein neues Array kopieren?
Das neue Array müsste sich automatisch vergrössern wenn ein neuer Eintrag kommt. Später will ich das neue Array in ein Worksheet ausgeben.
Ich dachte so hier, aber das funktioniert nicht:
Sub ArrayZeileinAnderesArrayEinlesen()
Dim arrAlleDaten
Dim arrAuszugDaten
Dim i As Long
Dim size As Long
arrAlleDaten = Range("A1:C10")
size = 1
For i = LBound(arrAlleDaten) To UBound(arrAlleDaten)
ReDim Preserve arrAuszugDaten(size, 10)
arrAuszugDaten(size) = arrAlleDaten(i)
size = size + 1
Next i
End Sub

Grüsse
Kailash

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array Zeile in anderes Array einlesen.
30.07.2017 09:18:39
Matthias
Moin! Das hier würde dir bspw. die 2. Zeile kopieren. Bei deinem Code würdest du doch (wenn ich das richtig deute) alles übertragen. Da bräuchtest du doch nicht zeilenweise vorgehen. VG

Sub ArrayZeileinAnderesArrayEinlesen()
Dim arrAlleDaten
Dim arrAuszugDaten()
Dim i As Long
Dim size As Long
arrAlleDaten = Range("A1:C10")
size = 1
ReDim Preserve arrAuszugDaten(1 To size, 1 To 10)
zeile = 2
For i = 1 To UBound(arrAlleDaten, 2)
arrAuszugDaten(1, i) = arrAlleDaten(zeile, i)
Next i
End Sub

Preserve kann nur die letzte Dimension ändern
30.07.2017 09:48:45
Zwenn
Hallo Matthias,
der Parameter Preserve der ReDim Anweisung kann nur die letzte Dimension eines Arrays ändern. Deshalb geht das, was Du geschrieben hast nicht.
https://msdn.microsoft.com/de-de/library/w8k3cys2(v=vs.120).aspx
Abgesehen davon sehe ich es auch so, dass der Code nur das Ausgangsarray duplizieren soll. Da stellt sich mir die Frage nach der Anwendung?
Viele Grüße,
Zwenn
Anzeige
AW: Preserve kann nur die letzte Dimension ändern
30.07.2017 10:13:02
Matthias
Moin! Danke für den Hinweis. Ist mir bekannt, hatte hier aber grad nicht aufgepasst sondern nur den Code schnell umgebastelt. Da sich hier beim Redim eigentlich auch nichts ändert, funktioniert der Code für den einen Fall. Sollte halt nur nicht in eine Schleife wie am Anfang umgebaut werden, dann kommt der Fehler. Falls sich Kailash nochmal meldet, könnte man das auch noch beheben (fehlen eh noch ein paar Hinweise). Vielen Dank nochmal und ein schönes Wochenende. VG
nutze die zweite Dimension
30.07.2017 10:53:27
Tino
Hallo,
du musst die zweite Dimension (Waagerecht) nutzen um dein Array in der größe anzupassen.
Für die Ausgabe wird dann das Array gedreht (Transpose) und Waagerecht wird zu senkrecht.
Bei einem sehr großen Array würde ich dies auch mit einem Code drehen,
sonst kann es vorkommen das für diese Aktion nicht genügend Speicher zu Verfügung steht.
Hier nur ein Beispiel:
Nach Möglichkeit sollte man nicht so oft Dimensionieren wie hier, macht den Code langsamer.
Wenn die benötigte Dimension bekannt ist, sollte man dies auch entsprechend nutzen!
Sub ArrayZeileinAnderesArrayEinlesen()
Dim arrAlle, arrAuszug()
Dim n&, nn&, i&
arrAlle = Tabelle1.Range("A1:C10")
For n = LBound(arrAlle) To UBound(arrAlle)
Select Case n
Case 1, 4, 6 To 7, 10
'2. Dimension Waagerecht + 1
i = i + 1
'2. Dimension anpassen (Waagerecht)
'1. Dimension bleibt immer gleich (Senkrecht)
ReDim Preserve arrAuszug(1 To UBound(arrAlle, 2), 1 To i)
For nn = LBound(arrAlle, 2) To UBound(arrAlle, 2)
arrAuszug(nn, i) = arrAlle(n, nn)
Next
End Select
Next n
If i > 0 Then
'für Ausgabe Array drehen
arrAuszug = Application.Transpose(arrAuszug)
Tabelle2.Range("A1").Resize(UBound(arrAuszug), UBound(arrAuszug, 2)) = arrAuszug
End If
End Sub
Gruß Tino
Anzeige
Wie konzeptuell, so auch technisch
30.07.2017 16:08:01
lupo1
Ein guter Softwareingenieur sah für das zu erwartende Volumen immer nur 3% - 30% des reservierten Volumens vor. Beispiel:
Gibt es 10 verschiedene Zustände, nahm er ein Byte.
Sind es hingegen 200, nahm er besser gleich Integer.

Vermutlich kommst Du so auch sehr schnell voran:

a = [A1:B123456]
'es folgen Bearbeitungen von a
'in a müssen nun 3 Zeilen bei "Zeile" 9999 eingefügt werden
[A1:B123456] = a                    'a hat sich mittlerweile geändert
[A100002:B123459] = [A9999:B123456] 'Versatz-Einfügung
a = [A1:B123459]                    'mit gedachter Lücke zurück nach VBA
'9999:10001 wird in VBA gelöscht und/oder überschrieben!
(alles in Wirklichkeit natürlich in Range-Schreibweise, die auch schneller ist)
Anzeige
was hat das mit der Frage zu tun? ...
30.07.2017 16:18:33
Tino
Hallo,
und was willst Du mir damit sagen?
Sehe keinen Zusammenhang!
Gruß Tino
bevor Du transponierst
30.07.2017 16:57:21
lupo1
wollte ich es etwas einfacher gestalten. Das mit dem Softwareingenieur war eine OT-Einleitung.
Ich habe zwar selbst noch nie mit Collections oder Dictionaries gearbeitet, aber käme das nicht auch noch in Frage?
AW: bevor Du transponierst
30.07.2017 17:06:46
Tino
Hallo,
Varianten gibt es einige, kommt auf den Zweck an.
z.Bsp. ein einfaches Dictionaries eignet sich in erste Linie nicht für mehrere Spalten.
Wenn dann noch doppelte Keys enthalten sind gehts auch nicht.
Aber selbst wenn,
müssen die Keys und Items in ein senkrechtes Array transponiert werden
bevor man diese in einen Range schreiben kann!
Gruß Tino
Anzeige
Danke an alle!
31.07.2017 06:01:38
Kailash
Herzlichen Dank an alle die mir geantwortet haben.
Ich konnte den Code von Tino anpassen und bei mir einbauen. Hat aber ein paar Stunden gedauert.
Das Transponieren war nicht möglich. Es ist error 13 type mismatch gekommen.
Der ist gekommen weil die Transponiergeschichte nur funktioniert, wenn u.a. die Zellinhalte weniger als 255 Zeichen sein müssen. Ich hatte mehr.
Also musste ich mit einer Schleife alles wieder umdimensionieren. Das hat dann funktioniert.
Zwenn hatte gefragt wozu das gut ist:
Meine Prozedur vergleicht importierte Daten mit Tabelle1 und mit Tabelle2 und schreibt dann die neuen Daten in Tabelle1.
Das was ich hier gefragt habe brauchte ich um alle neuen Daten in einem Array zu sammeln und es dann auf einen Schlag in die Tabelle zu schreiben, nicht zeilenweise. Weil das so angeblich schneller gehen soll.
Was Luc geschrieben hat, hat er mehr für Experten geschrieben, weil das verstehe ich leider gar nicht.
Herzlichen Dank an alle!
Kailash
Anzeige
Dann guggle mal nach 'Arrays in Arrays', ...
31.07.2017 16:00:42
Luc:-?
…Kailash!
Mit arX = Array(Array(1, 2, 3), Array(4, 5, 6)) ist arX ein solches Array, das aus einem vertikal-1-dimensionalen Vektor mit 2 Elementen besteht, die von horizontal-1-dimensionalen Vektoren mit 3 skalaren Elementen gebildet wdn. Mit arX(0) wird dann die gesamte 1.Zeile indiziert, mit arX(1) die 2., die man dann auch in Gänze irgendetwas zuweisen kann. Ein einzelnes skalares Element wird dann bspw mit arX(1)(1) identifiziert, was dem Wert 5 im Bsp entspräche.
Das ist das allgemein in ProgrammierSprachen übliche Array, das in diesen idR weitgehend auf einfache Weise manipuliert wdn kann, was in VBA nur teilweise, aber immer noch eher und besser möglich ist als beim Sonderfall n-dimensionales VBA-Array.
Das haben Andere und ich alles schon oft erläutert. Man kann das im hiesigen und in den Archiven anderer Foren finden.
Luc :-?
Anzeige
Grundsätzliches
30.07.2017 14:43:27
Luc:-?
Diese mehrdimensionalen typischen VBA-Arrays sind dem Aufbau einer Tabelle geschuldet, Folks;
das ist aber oft, so auch bei Dimensionsänderungen, ungünstig. Verwendet man den anderen, allgemeineren Array-Typ, kann man eine 2dimensionale Matrix durch einen Vektor, dessen Elemente ebenfalls Vektoren sind ersetzen. Damit erhält man lauter 1dimen­sio­nale Vektoren, die auch alle redimmt wdn können. Außerdem lässt sich so auch eine ganze Zeile problemlos indizieren, da der StandardAufbau eines solchen Arrays ebenfalls der TabStruktur folgt → also ein senkrechter 1dimensionaler Vektor (z) mit m Elementen als Container für m 1dimensionale waagerechte Vektoren mit n Elementen (s) → VArr(m)(nm). Eine ganze Zeile wäre dann VArr(z), ein Einzelwert VArr(z)(s). Für eine ganze Spalte müsste das Array andersherum aufgebaut wdn.
Wie man das macht, kann der VBE-Hilfe und Forumsarchiven entnommen wdn.
🙈 🙉 🙊 🐵 Gruß, Luc :-?
Besser informiert mit …
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen