Zeilen aus Array schnell entfernen
Schritt-für-Schritt-Anleitung
Um in einem zweidimensionalen Array (z.B. Array_Parent
) bestimmte Zeilen zu entfernen und in ein neues Array (z.B. Array_Child
) zu schreiben, kannst du die folgende VBA-Prozedur verwenden:
Option Explicit
Public arrParent As Variant
Public arrChild As Variant
Private Sub UserForm_Initialize()
Dim LetzteZeile As Integer
Dim k As Integer
Dim i As Integer
With Worksheets(1)
LetzteZeile = .Cells(Rows.Count, 1).End(xlUp).Row
arrParent = .Range(.Cells(2, 1), .Cells(LetzteZeile, 17))
End With
For i = 1 To LetzteZeile - 1
If arrParent(i, 17) = "0" Then
k = k + 1
End If
Next i
ReDim arrChild(1 To k, 1 To 17)
k = 0
For i = 1 To LetzteZeile - 1
If arrParent(i, 17) = "0" Then
k = k + 1
For j = 1 To 17
arrChild(k, j) = arrParent(i, j)
Next j
End If
Next i
End Sub
Diese Prozedur liest die Daten aus einem Arbeitsblatt, zählt die Zeilen mit einer "0" in Spalte 17 und kopiert diese in ein neues Array.
Häufige Fehler und Lösungen
-
Dauer der Ausführung: Wenn der Code zu lange dauert, könnte es an der Verwendung von ReDim Preserve
innerhalb der Schleife liegen. Dies verlangsamt die Ausführung erheblich, da bei jedem Schritt die Array-Dimensionierung neu durchgeführt wird.
Lösung: Dimensioniere das Array vor der Schleife, um die Geschwindigkeit zu erhöhen.
-
Typenkonflikte: Achte darauf, dass die Datentypen in den Arrays übereinstimmen. Wenn du ein Variant verwendest, stelle sicher, dass du die richtigen Werte zuweist.
Alternative Methoden
Eine alternative Methode zur Bearbeitung von Arrays ist die Verwendung von Collection oder Dictionary-Objekten. Diese Objekte ermöglichen eine flexiblere Handhabung von Daten und können die Performance in bestimmten Fällen verbessern.
Beispiel mit Collection:
Dim coll As Collection
Set coll = New Collection
For i = 1 To UBound(arrParent)
If arrParent(i, 17) = "0" Then
coll.Add arrParent(i)
End If
Next i
' Umwandlung in Array
arrChild = Application.Transpose(coll)
Praktische Beispiele
Beispiel 1: Du möchtest alle Zeilen aus einem Array, bei denen in Spalte 17 eine "1" steht, in ein neues Array kopieren:
For i = 1 To LetzteZeile
If arrParent(i, 17) = "1" Then
' Zeile in arrChild kopieren
End If
Next i
Beispiel 2: Ändere den Code, um eine andere Bedingung zu testen, z.B. um nur Zeilen mit einem bestimmten Wert in einer anderen Spalte zu kopieren.
Tipps für Profis
-
Vermeide GoTo: Versuche, die Verwendung von GoTo
zu minimieren, da dies den Code schwerer lesbar macht. Nutze stattdessen strukturierte Programmierung mit Schleifen und Bedingungen.
-
Verwende UBound: Nutze UBound
für die Dimensionierung von Arrays, um sicherzustellen, dass du die richtige Größe verwendest und Fehler zu vermeiden.
-
Optimiere Schleifen: Überlege, wie viele Schleifen du benötigst. Oft kannst du mehrere Bedingungen in einer Schleife abarbeiten.
FAQ: Häufige Fragen
1. Wie kann ich die Größe eines Arrays dynamisch ändern?
Du kannst die Funktion ReDim
verwenden, um die Größe eines Arrays zu ändern. Wenn du die bestehenden Werte beibehalten möchtest, benutze ReDim Preserve
.
2. Was ist der Unterschied zwischen ReDim und ReDim Preserve?
ReDim
ändert die Größe eines Arrays und löscht alle bestehenden Werte. ReDim Preserve
behält die Werte in allen Dimensionen, außer der letzten, bei.