VBA Makro Excel Zeile löschen, wenn Bedingung erfüllt?
Hi, bin blutiger Anfänger, was das angeht.
Ich würde gerne einen Makro haben, der mir Zeilen löscht, wenn sie leer sein sollten oder einen bestimmten Text enthalten.
Ist hier jemand versiert genug so etwas zu erstellen und mir möglicherweise grob erklären kann, was er gemacht hat?
Vielen Dank im Voraus.
6 Antworten
An sich keine große Sache. Aber Du müsstest schon ein bisschen präzisieren, was wo stehen soll oder eben nicht. Wichtig wäre auch noch, ob alle Spalten überprüft werden müssen, oder ob es reicht, zu prüfen ob die Zelle in Spalte A leer ist, um sagen zu können, dass die gesamte Zeile leer ist.
Der Ablauf wäre folgender:
In einer Schleife prüfst Du von der letzten zur ersten Zeile, ob die Bedingungen erfüllt sind. Wenn ja, EntireRow löschen. Wichtig ist die Reihenfolge, nämlich von unten nach oben. Andersherum geht es nicht.
Teste mal:
Sub Loeschen()
Dim lonEnde As Long
Dim lonZeile As Long
On Error GoTo ErrorHandler
Application.ScreenUpdating = False
lonEnde = Cells(Rows.Count, 1).End(xlUp).Row
For lonZeile = lonEnde To 1 Step -1
If IsEmpty(Cells(lonZeile, 1)) Or Cells(lonZeile, 1) = "Bestimmter Text" Then Cells(lonZeile, 1).EntireRow.Delete
Next lonZeile
ErrorHandler: Application.ScreenUpdating = True
End Sub
Ist es möglich, dass man sagt, die Zelle muss nur irgendwo dieses eine Wort enthalten und er löscht es dann? Und kann man auch mehrere Textbedingungen einfügen? Vielen Dank schonmal
Wie lange ist denn "so lange" und wie viele Zeilen müssen denn bearbeitet werden und wie viele davon sind leer und müssen gelöscht werden?
Der Code ist schon sehr langsam, weil jede Zeile einzeln geprüft und ggf. gelöscht wird. Und ja, man kann auch mehrere Bedingungen setzen und auch auf teilweisen Inhalt prüfen, aber dadurch wir es wahrscheinlich noch viel langsamer.
Kann sein, dass da jemand etwas Schnelleres hinbekommt!?. Ich lasse Deine Frag nochmal neu aufrufen.
Vorbemerkung:
Weißt du, wie man ein Makro aufzeichnet? (D. h. wie man das, was man in Excel tut, als Befehlsfolge aufzeichnen lässt, um diese Befehlsfolge später genau so wiederholen zu können)
Wenn nicht, frag noch mal nach.
-----
Starte die Aufzeichnung eines Makros
Lösche eine Zeile so, wie du sie gelöscht haben möchtest
Beende die Makro-Aufzeichnung
Ändere den Macro-Code so ab, dass eine beliebig vorgegebene Zeile gelöscht wird
oder: poste den Text des Makros (bitte als "Quelltext" formatieren), dann kann ich dir sagen, wie die Zeile anzupassen ist
-----
Weißt du, wie man das Kriterium im Makro prüft? Falls nein, müsstest du auch hierzu noch mal nachfragen.
-----
Beim Löschen empfehle ich grundsätzlich, von hohen Indizes zu niedrigen zu gehen, weil man sich dabei am wenigsten Ärger einhandeln kann - man kann eine einfache Zählschleife verwenden und man muss das Zählen beim Löschen auch nicht unterbrechen.
Und so würde das aussehen:
Sub ZeilenLoeschen()
' Leere Zeilen sollen gelöscht werden und solche, in denen in Spalte C "Das soll weg" steht
Dim i As Long
For i = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
If (Application.WorksheetFunction.CountA(Rows(i)) = 0) Or (Range("C" & i) = "Das soll weg") Then Rows(i).Delete
Next i
End Sub
Es wäre hilfreich, wenn Du Deine Fragen konkreter stellen würdest und alle Informationen mitlieferst, die man zur Beantwortung braucht.
Okay natürlich, mein Fehler.
Ich bräuchte ein Makro, dass in der Spalte A jede Zeile löscht, die die Worte "ID", "World" und "decrypt" enthalten. Ebenfalls leere Zeilen. Diese Worte sind aber Teil eines Satzes, reicht das, damit das Makro diese Zeilen erkennt, oder müssen es die gesamten Sätze sein?
Wie ist es möglich mehrere Bedingungen da mit reinfließen zu lassen für die Spalte A?
Hi,
aufbauend auf dem Vorschlag von Oubyi hier ein VBA Code, der unter den genannten Bedingungen ganze Zeilen löscht.
Anmerkung:
lonEnde = Cells(Rows.Count, 1).End(xlUp).Row
funktionierte nicht, sofern die Zelle in Spalte A in der letzten Zeile leer war. Dann startete das Makro in der letzten Zeile, in der Spalte A nicht leer war.
Sub Loeschen()
Dim lonEnde As Long
Dim lonZeile As Long
On Error GoTo ErrorHandler
Application.ScreenUpdating = False
lonEnde = ActiveSheet.UsedRange.Rows.Count
For lonZeile = lonEnde To 1 Step -1
If IsEmpty(Cells(lonZeile, 1)) Then
Rows(lonZeile).Delete
ElseIf InStr(1, Cells(lonZeile, 1), "ID") <> 0 Then Rows(lonZeile).Delete
ElseIf InStr(1, Cells(lonZeile, 1), "World") <> 0 Then Rows(lonZeile).Delete
ElseIf InStr(1, Cells(lonZeile, 1), "decrypt") <> 0 Then Rows(lonZeile).Delete
End If
Next lonZeile
ErrorHandler: Application.ScreenUpdating = True
End Sub
Ich hoffe, das passt so und freue mich auf Feedback, insbesondere ob es Geschwindigkeitsprobleme gibt.
Gruß
Hannes
Ich würde gerne einen Makro haben, der mir Zeilen löscht, wenn sie leer sein sollten oder einen bestimmten Text enthalten.
.
ohne VBA oder Makro kannst Du das leicht über "Autofilter" selektieren / sortieren und ggf. löschen.
Oh ja, Entschuldigung, da hätte ich präziser sein sollen. Ich wollte nur die gesamte Spalte A überprüfen lassen.