ReDim Preserve eines 2D Arrays in VBA
Schritt-für-Schritt-Anleitung
Um ein 2D Array in VBA mit ReDim Preserve anzupassen, gehe wie folgt vor:
-
Definiere das Array: Lade die Daten von einem Excel-Bereich in ein Variant-Array.
Dim myArray As Variant
myArray = Range("A1:B10")
-
Erstelle ein temporäres Array: Erstelle ein temporäres Array, um die Werte zu speichern.
Dim tmp() As Variant
ReDim tmp(1 To UBound(myArray, 1), 1 To UBound(myArray, 2))
-
Fülle das temporäre Array: Durchlaufe das Original-Array, filtere die leeren Zellen und speichere die Werte im temporären Array.
Dim lngCount As Long
For x = LBound(myArray, 1) To UBound(myArray, 1)
If myArray(x, 1) <> "" Then
lngCount = lngCount + 1
For c = LBound(myArray, 2) To UBound(myArray, 2)
tmp(lngCount, c) = myArray(x, c)
Next c
End If
Next x
-
Redimensioniere das Array mit Preserve: Redimensioniere das temporäre Array, um die Anzahl der Zeilen anzupassen.
ReDim Preserve tmp(1 To lngCount, 1 To UBound(myArray, 2))
-
Übertrage die Werte zurück nach Excel: Fülle die Zellen in der Excel-Tabelle mit den Werten aus dem temporären Array.
For x = 1 To UBound(tmp, 1)
For c = 1 To UBound(tmp, 2)
Cells(x, c + 4) = tmp(x, c)
Next c
Next x
Häufige Fehler und Lösungen
Ein häufiger Fehler beim Arbeiten mit ReDim Preserve ist der Index außerhalb des gültigen Bereichs. Dies geschieht oft, wenn du versuchst, die erste Dimension eines 2D Arrays zu ändern. Beachte, dass du nur die letzte Dimension ändern kannst.
Lösung: Wenn du die erste Dimension anpassen musst, kannst du die Dimensionen mit WorksheetFunction.Transpose tauschen. Hier ein Beispiel:
arr = WorksheetFunction.Transpose(arr)
ReDim Preserve arr(...)
arr = WorksheetFunction.Transpose(arr)
Alternative Methoden
Wenn ReDim Preserve nicht funktioniert, kannst du folgende Alternativen in Betracht ziehen:
- Kopieren des Arrays: Erstelle ein neues Array mit der gewünschten Größe und kopiere die Daten manuell.
- Verwende ein Collection-Objekt: Anstelle eines Arrays kannst du auch ein Collection-Objekt verwenden, das dynamisch wächst, ohne die Dimensionen manuell anpassen zu müssen.
Praktische Beispiele
Hier ist ein einfaches Beispiel für das Arbeiten mit einem 2D Array in VBA:
Sub BeispielReDimPreserve()
Dim myArray As Variant
Dim i As Long, j As Long
myArray = Range("A1:B10").Value
Dim tmp() As Variant
ReDim tmp(1 To UBound(myArray, 1), 1 To UBound(myArray, 2))
' Werte kopieren
For i = 1 To UBound(myArray, 1)
For j = 1 To UBound(myArray, 2)
tmp(i, j) = myArray(i, j)
Next j
Next i
' Redimensionieren
ReDim Preserve tmp(1 To UBound(myArray, 1), 1 To 5)
' Ausgabe
Range("D1").Resize(UBound(tmp, 1), UBound(tmp, 2)).Value = tmp
End Sub
Tipps für Profis
- Verwende die
Option Base 1, um sicherzustellen, dass deine Arrays bei 1 beginnen, was die Indizes übersichtlicher macht.
- Nutze
Debug.Print für die Fehlersuche, um die Werte der Variablen während der Ausführung zu überprüfen.
- Achte darauf, dass du beim Arbeiten mit
ReDim Preserve die Datentypen im Array gleich hältst, um Komplikationen zu vermeiden.
FAQ: Häufige Fragen
1. Kann ich mit ReDim Preserve die Anzahl der Dimensionen eines Arrays ändern?
Nein, du kannst nur die Größe der letzten Dimension ändern. Die Anzahl der Dimensionen bleibt gleich.
2. Was passiert, wenn ich versuche, die erste Dimension eines 2D Arrays zu ändern?
Du erhältst eine Fehlermeldung, da ReDim Preserve nicht auf die erste Dimension angewendet werden kann.
3. Wie kann ich leere Zellen aus einem Array entfernen?
Du kannst eine Schleife verwenden, um die Werte in ein temporäres Array zu kopieren und dabei leere Zellen zu ignorieren.
4. Gibt es eine Einschränkung bei der Größe von Arrays in VBA?
Ja, die maximale Arraygröße in VBA ist durch den verfügbaren Speicher des Systems und die 2 GB Grenze für die gesamte VBA-Anwendung begrenzt.