VBA Makro Excel Zeile löschen, wenn Bedingung erfüllt?

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.

Ceslior 
Fragesteller
 19.04.2020, 15:53

Oh ja, Entschuldigung, da hätte ich präziser sein sollen. Ich wollte nur die gesamte Spalte A überprüfen lassen.

1
Oubyi, UserMod Light  20.04.2020, 14:29
@Ceslior

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
1
Ceslior 
Fragesteller
 20.04.2020, 15:50
@Oubyi, UserMod Light

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

1
Ceslior 
Fragesteller
 20.04.2020, 16:06
@Ceslior

Und ist es normal, dass das Makro so lange braucht, um sich anzuwenden?

1
Oubyi, UserMod Light  20.04.2020, 20:26
@Ceslior

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.

1

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


Ceslior 
Fragesteller
 20.04.2020, 05:07

Wie ist es möglich mehrere Bedingungen da mit reinfließen zu lassen für die Spalte A?

1
Hannes62a  20.04.2020, 08:36

Es wäre hilfreich, wenn Du Deine Fragen konkreter stellen würdest und alle Informationen mitlieferst, die man zur Beantwortung braucht.

1
Ceslior 
Fragesteller
 21.04.2020, 06:31
@Hannes62a

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?

0

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.

Woher ich das weiß:eigene Erfahrung