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

Array durchlaufen und Zeilen löschen

Forumthread: Array durchlaufen und Zeilen löschen

Array durchlaufen und Zeilen löschen
16.03.2022 12:42:58
Constantin
Hallo,
ich möchte in einer Tabelle alle Zeilen, die eine bestimmte Bedingung in Spalte A nicht erfüllen, löschen und übergebe dafür als Kriterium eine Variable (Array?) mit verschiedenen Elementen.
In der beigefügten Mappe stehen in der Tabelle "Daten" (ab Zeile 2) die zu prüfenden Zeilen. Die zu prüfende Spalte ist die Spalte A. Ich möchte dafür folgenden Zellinhalt übergeben, z.B.: ABC; AZZ; XYZ1; AZ36
Beginnt eine Zeile (in Spalte A) nicht mit einem der hier genannten Strings, soll diese Zeile gelöscht werden, sonst nicht. Ist der Eintrag in Spalte A z.B. "AZF", soll diese Zeile gelöscht werden, da diese Bezeichnung nicht Teil des Suchstrings ist. Eine Zeile mit der Bezeichnung XYZ11 dürfte man nicht löschen, da sie mit XYZ1 beginnt (also immer der Teilstring von links gesehen ist zu prüfen; wenn nicht in der Variable (Array) enthalten, dann Zeile löschen.)
Ich würde mich freuen, wenn jemand einen guten VBA-Tipp hätte.
Grüße, Constantin
https://www.herber.de/bbs/user/151799.xlsx
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array durchlaufen und Zeilen löschen
16.03.2022 12:59:17
ChrisL
Hi Constantin

Sub t()
Dim lngZeile As Long, i As Integer, b As Boolean
Dim arrKuerzel As Variant
arrKuerzel = Split("ABC;AZZ;XYZ1;AZ36", ";")
Application.ScreenUpdating = False
With Worksheets("Daten")
For lngZeile = .Cells(.Rows.Count, 1).End(xlUp).Row To 2 Step -1
b = False
For i = LBound(arrKuerzel) To UBound(arrKuerzel)
If .Cells(lngZeile, 1) Like arrKuerzel(i) & "*" Then
b = True
Exit For
End If
Next i
If Not b Then .Rows(lngZeile).Delete
Next lngZeile
End With
End Sub
cu
Chris
Anzeige
AW: Array durchlaufen und Zeilen löschen
16.03.2022 14:31:50
Constantin
Hallo Chris,
vielen Dank für den Lösungsvorschlag. Funktioniert bestens!
Grüße, Constantin
kleiner Tip am Rande:
16.03.2022 14:40:38
Daniel
Wenn man prüfen will, ob eine Schleife vollständig durchlaufen ist, dann kann man das auch am Schleifenzähler feststellen.
bei einem vollständigen Durchlauf ist der Schleifenzähler immer größer als der Schleifenendwert.
Wurde die Schleife vorzeitig mit Exit For verlassen, ist der Schleifenzähler kleiner oder gleich dem Schleifenendwert.
damit spart man sich die zusätzliche Variable und aus:

b = False
For i = LBound(arrKuerzel) To UBound(arrKuerzel)
If .Cells(lngZeile, 1) Like arrKuerzel(i) & "*" Then
b = True
Exit For
End If
Next i
If Not b Then .Rows(lngZeile).Delete
wird

For i = LBound(arrKuerzel) To UBound(arrKuerzel)
If .Cells(lngZeile, 1) Like arrKuerzel(i) & "*" Then Exit For
Next i
If i > UBound(arrKuerzel) Then .Rows(lngZeile).Delete
Gruß Daniel
Anzeige
Tipp gelesen, danke owT.
16.03.2022 18:26:23
ChrisL
.
AW: Array durchlaufen und Zeilen löschen
17.03.2022 14:12:02
ChrisL
Hi
Hier die Variable ausgesondert. Die Verwendung einer Unterprozedur ist natürlich nicht zwingend.

Sub Makro1()
Dim x As String
x = "ABC;AZZ;XYZ1;AZ36"
Call MachMal(x)
End Sub

Private Sub MachMal(strKuerzel As String)
Dim lngZeile As Long, i As Integer
Dim arrKuerzel As Variant
arrKuerzel = Split(strKuerzel, ";")
Application.ScreenUpdating = False
With Worksheets("Daten")
For lngZeile = .Cells(.Rows.Count, 1).End(xlUp).Row To 2 Step -1
For i = LBound(arrKuerzel) To UBound(arrKuerzel)
If .Cells(lngZeile, 1) Like arrKuerzel(i) & "*" Then Exit For
Next i
If i > UBound(arrKuerzel) Then .Rows(lngZeile).Delete
Next lngZeile
End With
End Sub
cu
Chris
Anzeige
AW: Array durchlaufen und Zeilen löschen
17.03.2022 18:09:54
Constantin
Hallo Chris,
irgendwas muss auf meiner Seite wohl die Kompilierung geblockt haben. Ich habe eine neue Datei verwendet. Klappt jetzt einwandfrei (und auch mit Variable). Besten Dank!!!
Grüße, Constantin
AW: Array durchlaufen und Zeilen löschen
16.03.2022 13:12:36
MCO
Hallo Constantin!
Damit sollte es klappen:
Wühl dich mal durch

Sub filter()
arr = Array("ABC", "AZZ", "XYZ1", "AZ36")
For i = ActiveSheet.UsedRange.Rows.Count To 2 Step -1
For begr = 0 To UBound(arr)
If Left(Cells(i, 1), Len(arr(begr))) = arr(begr) Then
'Cells(i, 1).Interior.ColorIndex = 4
Rows(i).Delete
Exit For
End If
Next begr
Next i
End Sub
Gruß, MCO
Anzeige
AW: Array durchlaufen und Zeilen löschen
16.03.2022 14:36:57
Constantin
Hallo MCO,
hat auch geklappt (musste nur " arr" einsetzen). Vielen Dank für Deinen Alternativ-Vorschlag. Ebenfalls sehr hilfreich.
Grüße, Constantin
AW: Array durchlaufen und Zeilen löschen
16.03.2022 14:55:35
Daniel
Hi
ich bevorzuge es zum Löschen von Zeilen, diese zuerst per Formel zu markieren und dann über Exclmenüfunktionen wie Duplikate-Entfernen zu löschen. das ist in der Regel bei großen Datenmengen schneller als einzelne Zeilen per Schleife zu löschen:

Sub löschen()
Dim var As String
Dim FO As String
var = "ABC;AZZ;XYZ1;AZ36"
var = "{""" & Replace(var, ";", """,""") & """}"
FO = "=IF(OR(Left(RC1,Len(_var_))=_var_),Row(),0)"
FO = Replace(FO, "_var_", var)
With Sheets("Daten").Cells(1, 1).CurrentRegion
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = FO
.Cells(1, 1).FormulaR1C1 = 0
.EntireRow.RemoveDuplicates .Column, xlNo
.ClearContents
End With
End With
End Sub
Gruß Daniel
Anzeige
AW: Array durchlaufen und Zeilen löschen
17.03.2022 12:09:22
Constantin
Hallo Daniel,
Danke für die zusätzlichen Tipps. Die Geschwindigkeit kann evtl. noch eine Rolle spielen. Allerdings taucht momentan folgendes Problem auf: Es kommt die Meldung: Falsche Anzahl an Argumenten oder unzulässige Zuweisung einer Eigenschaft. Ich möchte die Suchbegriffe in einer Variablen übergeben, z.B. strText="ABC;ABD;ABX"
Irgendwie scheint es, dass ich irgendwas übersehen habe. Wie müsste z.B. das Programm von Chris angepasst werden, damit SPLIT sich auf eine Variable (z.B. strrText) bezieht? Es sollen dann alle Zeilen gelöscht werden, die in Spalte 1 weder mit ABC, ABD oder ABX beginnen. Wie kann ich eine Variable übergeben? Split (strtext, ...) hat nicht funktioniert.
Danke im Voraus nochmal für Eure Hilfe.
Grüße, Constantin

Sub t()
Dim lngZeile As Long, i As Integer, b As Boolean
Dim arrKuerzel As Variant
arrKuerzel = Split("ABC;AZZ;XYZ1;AZ36", ";")
Application.ScreenUpdating = False
With Worksheets("Daten")
For lngZeile = .Cells(.Rows.Count, 1).End(xlUp).Row To 2 Step -1
b = False
For i = LBound(arrKuerzel) To UBound(arrKuerzel)
If .Cells(lngZeile, 1) Like arrKuerzel(i) & "*" Then
b = True
Exit For
End If
Next i
If Not b Then .Rows(lngZeile).Delete
Next lngZeile
End With
End Sub

Anzeige
AW: Array durchlaufen und Zeilen löschen
17.03.2022 14:00:00
Daniel
HI
naja, Variable statt konstanter Text einzusetzen, das sind doch Basics, die bei Basiskenntnissen eigentlich bekannt sein sollen.
wenns probleme gibt, solltest du schon deinen Code zeigen, vorallem auch wo und wie die Variable befüllt wird.
Ansonsten, wenn du Fragen zu Chris Code hast, frage Chris.
Gruß Daniel
Anzeige
AW: Array durchlaufen und Zeilen löschen
17.03.2022 18:17:52
Constantin
Hallo Daniel,
Klappt auch - und die "Speed" ist in der Tat beeindruckend und bei größeren Datenmengen sehr nützlich. Danke.
Grüße, Constantin
AW: Array durchlaufen und Zeilen löschen
17.03.2022 14:20:24
Rudi
schwebt dir sowas vor?

Sub aaaa()
Call ZeilenLoeschen("ABC;ABD;ABX")
End Sub
Sub ZeilenLoeschen(strTEXT As String)
Dim lngZeile As Long, i As Integer
Dim rngDEL As Range
Dim arrKuerzel As Variant
arrKuerzel = Split(strTEXT, ";")
Application.ScreenUpdating = False
With Worksheets("Daten")
For lngZeile = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
For i = LBound(arrKuerzel) To UBound(arrKuerzel)
If .Cells(lngZeile, 1) Like arrKuerzel(i) & "*" Then
If rngDEL Is Nothing Then
Set rngDEL = .Cells(lngZeile, 1)
Else
Set rngDEL = Union(rngDEL, .Cells(lngZeile, 1))
End If
End If
Next i
Next lngZeile
End With
If Not rngDEL Is Nothing Then
rngDEL.EntireRow.Delete
End If
End Sub
Gruß
Rudi
Anzeige
AW: Array durchlaufen und Zeilen löschen
17.03.2022 16:51:38
Constantin
Hallo Rudi,
vielen Dank für Deinen Vorschlag. Vielleicht liegt es an der Version. Kann es sein, dass Excel 2013 "meckert" und Excel 2010 nicht? Bei Excel 2010 lief z.B. die Version von Chris einwandfrei. Auch folgende Änderung hat das Programm vertragen:
Statt: arrKuerzel = Split("ABC;AZZ;XYZ1;AZ36", ";") habe ich den Inhalt zuerst in eine Variable gesetzt: strText = "ABC;AZZ;XYZ1;AZ36" und dann : arrKuerzel = Split(strText, ";") verwendet. Dann erschien die Fehlermeldung (in Excel 2013). In 2010 geht es offensichtlich. Erscheint diese "Wahrnehmung" plausibel?
Die Variable strText hat bei jedem Öffnen der Datei unterschiedliche Inhalte, deswegen nicht fest vorgegeben. Ich übernehme die Werte aus einer anderen Zelle. Danach ist jede Zeile in Spalte A zu prüfen, ob sie mit einer der angegeben Buchstabenfolgen (von links gesehen) übereinstimmt oder nicht. Wenn nicht, dann ist die Zeile zu löschen (für obiges Beispiel wäre die Zeile zu löschen, wenn nur "AB" in Spalte A stünde). Alle Zeilen, die mit ABC, AZZ, XYZ1 oder AZ36 beginnen, müssten in diesem Beispiel erhalten bleiben.
Ihr habt mir schon sehr viel geholfen. Ich werde es einfach nochmal genau anschauen.
Grüße, Constantin
Anzeige
AW: Array durchlaufen und Zeilen löschen
17.03.2022 18:15:05
Constantin
Hallo Rudi,
so eine "innere Einkehr" ist manchmal nicht schlecht. Es klappt jetzt. Danke nochmal.
Grüße, Constantin
;
Anzeige
Anzeige

Infobox / Tutorial

Array durchlaufen und Zeilen löschen in Excel


Schritt-für-Schritt-Anleitung

  1. Öffne Deine Excel-Datei und wechsle zur Tabelle "Daten".
  2. Drücke ALT + F11, um den VBA-Editor zu öffnen.
  3. Klicke auf Einfügen und dann auf Modul, um ein neues Modul zu erstellen.
  4. Füge den folgenden VBA-Code ein, um ein Array durchlaufen und Zeilen zu löschen, die nicht mit den definierten Kriterien übereinstimmen:
Sub ZeilenLoeschen()
    Dim lngZeile As Long, i As Integer
    Dim arrKuerzel As Variant
    arrKuerzel = Split("ABC;AZZ;XYZ1;AZ36", ";")
    Application.ScreenUpdating = False
    With Worksheets("Daten")
        For lngZeile = .Cells(.Rows.Count, 1).End(xlUp).Row To 2 Step -1
            For i = LBound(arrKuerzel) To UBound(arrKuerzel)
                If .Cells(lngZeile, 1) Like arrKuerzel(i) & "*" Then Exit For
            Next i
            If i > UBound(arrKuerzel) Then .Rows(lngZeile).Delete
        Next lngZeile
    End With
    Application.ScreenUpdating = True
End Sub
  1. Schließe den VBA-Editor und kehre zu Excel zurück.
  2. Drücke ALT + F8, wähle ZeilenLoeschen und klicke auf Ausführen.

Häufige Fehler und Lösungen

  • Fehler: Falsche Anzahl an Argumenten oder unzulässige Zuweisung einer Eigenschaft.

    • Lösung: Stelle sicher, dass Dein Array richtig definiert ist und die Variablen korrekt zugewiesen werden. Überprüfe auch, ob Du die richtige Excel-Version verwendest, da einige Funktionen je nach Version unterschiedlich funktionieren.
  • Fehler: Zeilen werden nicht gelöscht.

    • Lösung: Überprüfe, ob die Werte in Spalte A tatsächlich mit den definierten Kriterien übereinstimmen. Achte darauf, dass die Schreibweise identisch ist.

Alternative Methoden

Eine alternative Methode, um Zeilen zu löschen, besteht darin, zuerst die Zeilen mit einer Formel zu markieren und dann die Excel-Funktion "Duplikate entfernen" zu verwenden. Hier ist ein Beispiel:

Sub entfernen()
    Dim var As String
    var = "ABC;AZZ;XYZ1;AZ36"
    var = "{""" & Replace(var, ";", """,""") & """}"
    With Sheets("Daten").Cells(1, 1).CurrentRegion
        With .Columns(.Columns.Count + 1)
            .FormulaR1C1 = "=IF(OR(Left(RC1,Len(_var_))=_var_),Row(),0)"
            .Cells(1, 1).FormulaR1C1 = 0
            .EntireRow.RemoveDuplicates .Column, xlNo
            .ClearContents
        End With
    End With
End Sub

Diese Methode kann bei großen Datenmengen effizienter sein, da sie die Zeilen zuerst markiert, bevor sie gelöscht werden.


Praktische Beispiele

Hier sind einige Beispiele, wie Du das VBA-Skript anpassen kannst:

  1. Variablen anpassen: Um das Array dynamisch zu gestalten, kannst Du den Inhalt einer Zelle verwenden:
Sub ZeilenLoeschenMitVariable()
    Dim lngZeile As Long, i As Integer
    Dim arrKuerzel As Variant
    Dim strText As String
    strText = Worksheets("Daten").Cells(1, 1).Value ' Beispiel: Zelle A1
    arrKuerzel = Split(strText, ";")
    ' Der Rest des Codes bleibt gleich
End Sub
  1. Zusätzliche Bedingungen hinzufügen: Wenn Du beispielsweise nur Zeilen löschen möchtest, die in Spalte B einen bestimmten Wert haben, kannst Du dies leicht integrieren.

Tipps für Profis

  • Vermeide Bildschirmaktualisierungen: Setze Application.ScreenUpdating = False, um die Leistung zu verbessern, während das Skript läuft.
  • Nutze die Union-Funktion: Wenn Du mehrere Zeilen auf einmal löschen möchtest, kannst Du die Union-Funktion verwenden, um die zu löschenden Zeilen zu gruppieren.
  • Debugging-Hilfen: Füge Debug.Print-Anweisungen hinzu, um den Status des Skripts während der Ausführung zu überprüfen.

FAQ: Häufige Fragen

1. Frage: Kann ich das Array auch aus einem anderen Arbeitsblatt beziehen?
Antwort: Ja, Du kannst den Wert aus einer Zelle in einem anderen Arbeitsblatt lesen, indem Du den Namen des Arbeitsblattes in der Zuweisung angibst.

2. Frage: Was ist der Unterschied zwischen Like und = in VBA?
Antwort: Like wird verwendet, um Muster zu vergleichen, während = einen exakten Vergleich durchführt. Wenn Du nach Teilstrings suchst, verwende Like.

3. Frage: Wie kann ich sicherstellen, dass das Makro nur auf sichtbare Zeilen angewendet wird?
Antwort: Du kannst die SpecialCells-Methode verwenden, um nur sichtbare Zeilen auszuwählen, bevor Du das Löschen durchführst.

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