Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Array Zeile in anderes Array einlesen.

Forumthread: 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
Anzeige

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

Anzeige
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
Anzeige
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?
Anzeige
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
Anzeige

Infobox / Tutorial

Array Zeile in ein anderes Array einlesen


Schritt-für-Schritt-Anleitung

  1. Erstelle ein neues Modul in deinem VBA-Editor.

  2. Füge den folgenden Code ein, um eine Zeile aus einem bestehenden Array in ein neues Array zu kopieren:

    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
  3. Überprüfe die Dimensionen des Arrays, um sicherzustellen, dass du die richtigen Daten hast. Verwende dazu Debug.Print UBound(arrAlleDaten).

  4. Teste die Funktionalität, indem du das Makro im VBA-Editor ausführst.


Häufige Fehler und Lösungen

  • Error 13: Type Mismatch: Dieser Fehler tritt auf, wenn die Daten in deinem Array nicht dem erwarteten Typ entsprechen. Stelle sicher, dass alle Zellen im Bereich "A1:C10" die richtigen Datentypen enthalten.

  • Probleme beim Transponieren: Der Fehler kann auch auftreten, wenn die Zellinhalte mehr als 255 Zeichen haben. Achte darauf, die Zellinhalte vorher zu überprüfen und gegebenenfalls anzupassen.

  • Preserve kann nur die letzte Dimension ändern: Wenn du ein mehrdimensionales Array hast, denke daran, dass du bei Verwendung von ReDim Preserve nur die letzte Dimension anpassen kannst. Achte darauf, dass du die Dimensionen entsprechend planst.


Alternative Methoden

Eine interessante Alternative ist die Verwendung von Collections oder Dictionaries. Diese erlauben es dir, dynamisch Daten zu speichern, ohne die Dimensionen des Arrays manuell anpassen zu müssen. Hier ein Beispiel:

Dim myCollection As Collection
Set myCollection = New Collection

For i = 1 To UBound(arrAlleDaten, 1)
    myCollection.Add arrAlleDaten(i, 1)
Next i

Diese Methode ist besonders nützlich, wenn du nicht weißt, wie viele Elemente du speichern musst.


Praktische Beispiele

Hier sind einige praktische Anwendungsbeispiele für das Kopieren von Arrays:

  1. Kopiere die zweite Zeile eines Arrays in ein neues Array:

    Dim arrAuszug(1 To 1, 1 To 3)
    arrAuszug(1, 1) = arrAlleDaten(2, 1)
    arrAuszug(1, 2) = arrAlleDaten(2, 2)
    arrAuszug(1, 3) = arrAlleDaten(2, 3)
  2. Für größere Datenmengen solltest du die Dimensionen deines Arrays vorab festlegen, um die Performance zu verbessern:

    ReDim arrAuszug(1 To 1000, 1 To 10)

Tipps für Profis

  • Vermeide häufiges Redimensionieren: Wenn du weißt, wie viele Zeilen du erwartet, dimensioniere dein Array gleich zu Beginn, um die Performance zu steigern.

  • Nutze die Funktion Transpose: Wenn du dein Array auf ein Worksheet ausgeben willst, kann die Transpose-Funktion helfen, die Dimensionen anzupassen:

    Tabelle2.Range("A1").Resize(UBound(arrAuszug, 1), UBound(arrAuszug, 2)) = Application.Transpose(arrAuszug)
  • Debugging: Nutze Debug.Print und MsgBox, um den Status deines Arrays während der Ausführung zu überprüfen.


FAQ: Häufige Fragen

1. Wie kann ich ein Array in VBA kopieren?
Verwende die ReDim Preserve-Anweisung, um die Dimensionen eines Arrays zu ändern, oder nutze eine Schleife, um die Werte manuell zu kopieren.

2. Was ist der Unterschied zwischen einem eindimensionalen und einem mehrdimensionalen Array?
Ein eindimensionales Array hat nur eine Dimension (z.B. eine Liste), während ein mehrdimensionales Array mehrere Dimensionen hat (z.B. eine Tabelle mit Zeilen und Spalten).

3. Wie kann ich die Größe eines Arrays dynamisch anpassen?
Verwende ReDim Preserve, um die Größe des Arrays während der Laufzeit anzupassen. Beachte jedoch, dass nur die letzte Dimension verändert werden kann.

4. Kann ich ein Array in PowerShell ausgeben?
Ja, du kannst Arrays in PowerShell mit der Funktion Write-Output oder Out-File ausgeben.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige