Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Vba: Array dynamisch dimensionieren und einfügen

Vba: Array dynamisch dimensionieren und einfügen
30.09.2019 16:50:40
Christian
Grüßt euch,
Ich habe noch einige Verständnisprobleme bei der Funktion .rezise.
Ich möchte einen mit Daten befüllten Array, in mein Tabellenblatt einfügen.
Da der Array seine Größe dynamisch ändert, muss sich dementsprechend auch der Ausgabebereich vergrößern.
Der Code funktioniert soweit auch, ich muss nur bisher immer händisch die letzte Zahl im . rezise Befehl anpassen.

Renditen.Range(Renditen.Cells(6, (letzteSpaltestartNeu + 2)), Renditen.Cells(UBound(X, 1), (letzteSpaltestartNeu + 2))).Resize(UBound(X, 1), 3) = X
bisher habe ich die Spalte (im obigen Beispielcode, die 3 am Ende) händisch angepasst. Dies soll aber dynamisch passieren.
die Zeilengröße passt sich ja über die Ubound funktion dynamisch an.
Wie mach ich das nun mit der Spaltengröße?
Vielen Dank für eure Hilfe.
Grüße
Christian.
Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Vba: Array dynamisch dimensionieren und einfügen
30.09.2019 17:02:42
Daniel
Hi
schau mal nach, was Ubound(..., 1) bedeutet.
wenns ein 1 gibt, gibt's vermutlich auch einen anderen Wert, den man hier einsetzen könnte, in der Regel den benachbarten Wert 0 oder 2.
überlege mal, was es in einem 2-dimensionalen Array alles gibt und wofür dann dieser andere Wert in der UBound-Funktion stehen könnte.
und wie gesagt, du arbeitest mit 2-dimensionalen Arrays.
und noch ein Tipp: wenn du sowieso die Größe des Zellbereichs mit Resize bestimmst, dann reicht die Angabe der linken oberen Eckzelle aus, weil das .Resize die Größe der Range "überspielt"
Gruß Daniel
Anzeige
AW: Vba: Array dynamisch dimensionieren und einfügen
30.09.2019 17:19:02
onur
" in der Regel den benachbarten Wert 0 " - bist du sicher ?
AW: Vba: Array dynamisch dimensionieren und einfügen
30.09.2019 17:33:24
Daniel
omg. ist ja nur ein Beispiel, um zum selbst ausprobieren und Experimentieren anzuregen.
da darf man auch mal testen, was passiert wenn man einen unpassenden Wert vorgibt.
Gibt ja auch die Variante WAHR und FALSCH, die dann 1 und 0 sind, wenn man wegen der kürzeren Schreibweise mit Zahlenwerten arbeitet.
und 0 ist von 1 genauso ein Nachbar wie 2, nur halt nicht rechts, sondern links.
so what.
Gruß Daniel
Anzeige
AW: Vba: Array dynamisch dimensionieren und einfügen
30.09.2019 17:38:54
Christian
Hi onur und Daniel,
Renditen.Range(Renditen.Cells(6, (letzteSpaltestartNeu + 2)), Renditen.Cells(UBound(X, 1), (letzteSpaltestartNeu + 2))).Resize(UBound(X, 1), UBound(X, 2)) = X
mein Code habe ich nun so geschrieben. Könnte man diesen noch vereinfachen?
Das funktioniert.
Danke für eure "Anregungen". Ich denke so langsam komme ich hinter die Array Eigenschaften :D:D.
Grüße Christian
Anzeige
AW: Vba: Array dynamisch dimensionieren und einfügen
30.09.2019 17:45:55
Daniel
naja, wie ich dir schon schrieb: wenn du die größe des Zellbereichs mit .Resize bestimmst, reicht als Ausgangszellbereich davor die linke obere Eckzelle.
wenn ich beispielsweise den Zellbereich von A1:J10 beschreiben will, nehme ich entweder:
Cells(1, 1).Resize(10, 10) oder Range(Cells(1, 1), Cells(10, 10))
aber
Range(Cells(1, 1), Cells(10, 10)).Resize(10, 10) ist doppeltgemoppelt
wenn ich Start- und Endzeile kenne, nehme ich Range(Cells, Cells)
kenne ich jedoch Startzeile und die Anzahl der benötigten Zeilen, dann Cells.Resize
klaro?
Gruß Daniel
Anzeige
AW: Vba: Array dynamisch dimensionieren und einfügen
30.09.2019 17:48:11
Christian
Hi daniel,
hatte dir zu schnell geantwortet.
Nun noch vereinfacht, sieht der Code so aus.
Renditen.Cells(6, (letzteSpaltestartNeu + 2)).Resize(UBound(X, 1), UBound(X, 2)) = X
Funktioniert einwandfrei.
Vielen Dank für die schnelle kompetente Hilfe.
Christian
AW: Vba: Array dynamisch dimensionieren und einfügen
30.09.2019 17:20:52
Christian
Hallo Daniel,
"schau mal nach, was Ubound(..., 1) bedeutet." das ist mir klar, dass die 1 oder 2 oder.... die 2. Dimension also die Spaltenanzahl ist.
Nur ich weiß ja zu Beginn nicht, wie viele Spalten der Array haben wird.
Wie meinst du das mit dem "dann reicht die Angabe der linken oberen Eckzelle aus"?
Ich könnte also nur .Resize(Zelle,Spalte der Linken oberen Ecke angeben) ohne Ubound(X,1),3) ?
Für micht ist das verständnis mit den Arrays noch sehr sehr schlecht.
Das ist mein erstes VBA Projekt und allgemein erste Erfahrungen mit Codes.
Grüße Christian
Anzeige
AW: Vba: Array dynamisch dimensionieren und einfügen
30.09.2019 17:27:57
Christian
Hallo Daniel,
"schau mal nach, was Ubound(..., 1) bedeutet." das ist mir klar, dass die 1 oder 2 oder.... die 2. Dimension also die Spaltenanzahl ist.
Nur ich weiß ja zu Beginn nicht, wie viele Spalten der Array haben wird.
Wie meinst du das mit dem "dann reicht die Angabe der linken oberen Eckzelle aus"?
Ich könnte also nur .Resize(Zelle,Spalte der Linken oberen Ecke angeben) ohne Ubound(X,1),3) ?
Für micht ist das verständnis mit den Arrays noch sehr sehr schlecht.
Das ist mein erstes VBA Projekt und allgemein erste Erfahrungen mit Codes.
Grüße Christian
Anzeige
AW: Vba: Array dynamisch dimensionieren und einfügen
30.09.2019 17:38:03
Daniel
nein, natürlich mit Ubound.
ich meinte folgendes:
wenn du Schreibst Range("A1:Z1000").Resize(5, 10) bekommst du das gleiche Ergebnis wie mit Range("A1").Resize(5, 10), weil eben das Resize die endgültige Größe vorgibt und von der vorgesetzten Range nur die linke obere Eckzelle verwendet wird.
das Ubound brauchst du natürlich, um die Werte für das Resize zu ermitteln.
mir gings da um das Range(Cells(a, b), Cells(c, d)).Resize(x, y), hier reichet: Cells(a, b).resize(x, y) völlig aus.
Gruß Daniel
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Dynamisches Array in VBA dimensionieren und einfügen


Schritt-für-Schritt-Anleitung

  1. Array erstellen: Beginne mit der Definition eines dynamischen Arrays in VBA. Du kannst dies mit der Dim-Anweisung tun. Zum Beispiel:

    Dim X() As Variant
  2. Array Größe festlegen: Verwende die ReDim-Anweisung, um die Größe deines Arrays zu bestimmen. Beispiel:

    ReDim X(1 To 10, 1 To 3) ' Ein 2-dimensionales Array
  3. Daten füllen: Fülle das Array mit Werten. Zum Beispiel:

    For i = 1 To 10
       For j = 1 To 3
           X(i, j) = i * j
       Next j
    Next i
  4. Array dynamisch erweitern: Wenn du das Array erweitern möchtest, kannst du ReDim Preserve verwenden, um die vorhandenen Daten zu behalten:

    ReDim Preserve X(1 To 15, 1 To 3) ' Array auf 15 Zeilen erweitern
  5. Daten in das Tabellenblatt einfügen: Nutze die Resize-Methode, um die Zellgröße basierend auf der Größe des Arrays anzupassen:

    Renditen.Cells(6, (letzteSpaltestartNeu + 2)).Resize(UBound(X, 1), UBound(X, 2)) = X

Häufige Fehler und Lösungen

  • Fehler: "Laufzeitfehler 9: Index außerhalb des gültigen Bereichs"

    • Lösung: Stelle sicher, dass du die Dimensionen deines Arrays korrekt initialisierst und dass die Indizes innerhalb der Grenzen des Arrays liegen.
  • Fehler: "Typen unverträglich"

    • Lösung: Überprüfe den Datentyp des Arrays und stelle sicher, dass die zugewiesenen Werte kompatibel sind.

Alternative Methoden

  • Verwendung von Collections: Wenn du ein dynamisches Array in VBA verwenden möchtest, kannst du auch Collection-Objekte nutzen, die flexibler sind und das Hinzufügen von Elementen ohne vorherige Dimensionierung ermöglichen.

  • Dynamisches Array mit Variant: Du kannst auch ein Variant-Array verwenden, um unterschiedliche Datentypen zu speichern:

    Dim X() As Variant
    ReDim X(1 To 10)

Praktische Beispiele

  1. Ein einfaches Array erstellen und ausgeben:

    Dim X() As Variant
    ReDim X(1 To 5)
    For i = 1 To 5
       X(i) = i * 2
    Next i
    MsgBox Join(X, ", ") ' Gibt 2, 4, 6, 8, 10 aus
  2. Dynamisches Array mit Daten aus einem Tabellenblatt:

    Dim X() As Variant
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    ReDim X(1 To lastRow, 1 To 2)
    For i = 1 To lastRow
       X(i, 1) = Cells(i, 1).Value
       X(i, 2) = Cells(i, 2).Value
    Next i

Tipps für Profis

  • Nutze Option Base 1 am Anfang deines Moduls, um die Indizes bei 1 beginnen zu lassen, anstatt bei 0.
  • Vermeide es, Arrays zu oft mit ReDim zu ändern, da dies die Leistung beeinträchtigen kann. Versuche, die endgültige Größe im Voraus zu planen, wenn möglich.
  • Verwende Debug.Print zur Fehlersuche, um die Werte in deinem Array zu überprüfen.

FAQ: Häufige Fragen

1. Wie kann ich die Größe eines VBA-Arrays dynamisch anpassen? Um die Größe eines Arrays in VBA dynamisch anzupassen, verwende die ReDim Preserve-Anweisung. Dies bewahrt die bestehenden Daten.

2. Was ist der Unterschied zwischen ReDim und ReDim Preserve? ReDim ändert die Größe eines Arrays, wobei alle alten Daten verworfen werden, während ReDim Preserve die bestehenden Daten im Array beibehält.

3. Kann ich ein Array in VBA mit verschiedenen Datentypen verwenden? Ja, du kannst ein Variant-Array erstellen, das unterschiedliche Datentypen speichert, jedoch ist dies weniger effizient als die Verwendung von typisierten Arrays.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige