Excel VBA: Gesamte Zeile Löschen

Hallo Experten,
ich habe mir eine kleine Subroutine geschrieben, die gesamte zeilen löscht, wenn ein Stichwort drin vorkommt.

Sub Delete(arStr2Del, wksLokal As Worksheet)
Dim i
Dim intAnz
Dim j
For i = 0 To UBound(arStr2Del)

 intAnz = Application.WorksheetFunction.CountIf(wksLokal.Cells, "\*" & arStr2Del(i) & "\*")
 For j = 1 To intAnz
 'If Application.WorksheetFunction.CountIf(wksLokal.Cells, "\*" & arStr2Del(i) & "\*") \> 0 Then
 wksLokal.Cells.Find(What:=arStr2Del(i) & "\*").EntireRow.Delete
 'End If
 Next j

Next i 
End Sub

Jetzt benötige ich eine Lösung, die genau das umgekehrt macht:
Die zeilen wieder herstellt *scherz*
Nein ich benötige eine Lösung, die alle Zeile löscht, die das Keywort nicht enthalten.

Geht das? Oder muss ich die Zeilen kopieren und in ein neues Sheet einfügen?
Liebe Grüße
Winter

Hallo Winter,

Jetzt benötige ich eine Lösung, die genau das umgekehrt macht:
Die zeilen wieder herstellt *scherz*

ginge auch, kein Scherz. :smile:)

Nein ich benötige eine Lösung, die alle Zeile löscht, die das
Keywort nicht enthalten.

Je nach dem was in arStr2Del steht und was in der Tabelle hast du ggfs. ruckzuck ein leeres Blatt.

arStr2Del(0)=„xyz“
arStr2Del(1)=„abc“

die tabelle sieht so aus:

xyz
abc
xyz
abc
xyz
abc

Wenn du dann wieder die Werte einzeln abprüfst, so ist nach arStr2Del(0) die Tabelle nur noch so:

xyz
xyz
xyz

Nach Prüfung auf arStr2Del(1) ist die Tabelle leer.

Geht das?

Mutmaßlich mußt du die Prüfwerte per And verbinden,
also lösche alle Zeilen die „xyz“ UND „abc“ NICHT enthalten.

Gruß
Reinhard

Servus Reinhard,

ginge auch, kein Scherz. :smile:)

Geht alles, ist mir klar. Ist nur eine Frage des Aufwandes.

Mutmaßlich mußt du die Prüfwerte per And verbinden,
also lösche alle Zeilen die „xyz“ UND „abc“ NICHT enthalten.

uhh
das ist mir nicht ganz klar. Kansnt Du etwas ausformuleiren?

Vielleicht habe ich mich schlecht ausgedrückt:
Ich habe eine Tabelle die sieht so aus

abc
xyz
abc
def
abc
def
xyz
def

Wenn ich mein obiges Makro mit def als suche drüber laufen lassen kommt
abc
xyz
abc
abc
xyz
raus. genau was ich will. Funktioniert.

Aber jetzt will ich dass das Makro aus der Tabelle:
def
def
def
macht, wenn ich das def Stichwort übergebe.

Was geht ist natürlich (grober Code):

i=1
while i 
oder


     
    For i=1 to letzteZeile 
     if cells(1,5)= "def" then 
     entirerow.copy
     wksNeuesBlatt.paste Shift:=xlDown
     end if 
    next 


aber ich denke das dauert Ewigkeiten. Obige Lösung ist rasend schnell, zumindest beim löschen. 

Grüße Winter

Servus Winter,

Mutmaßlich mußt du die Prüfwerte per And verbinden,
also lösche alle Zeilen die „xyz“ UND „abc“ NICHT enthalten.

uhh
das ist mir nicht ganz klar. Kansnt Du etwas ausformuleiren?

Angenommen du hast eine Kundenliste, nun willst du nur die Kundenzeilen sehen der Kunden die in Hamburg oder München wohnen.
Wenn du nun in einer Schleife alle Zellen abklapperst und prüfst ob der Kunde in Hamburg wohnt und wenn nicht die Zeile löschst, so hast du dann das problem daß du gar nicht mehr nach Kunden in München zu suchen brauchst in einer zweiiten Schleife, weil deren Zeilen schon grad gelöscht wurden.
Also mußt du gleich in der Schleife nach den Zeilen suchen die „Hamburg“ UND „München“ NICHT enthalten und diese löschen.

Aber jetzt will ich dass das Makro aus der Tabelle:

macht, wenn ich das def Stichwort übergebe.

Nur ein Stichwort ? Im Anfangscode sah es nach mehreren Stichwörtern aus.

Nimm doch einen Autofilter, filter nach „def“ und kopiere das Ergebnis raus.

Gruß
Reinhard

Hallo Reinhard,

Mutmaßlich mußt du die Prüfwerte per And verbinden,
also lösche alle Zeilen die „xyz“ UND „abc“ NICHT enthalten.

uhh
das ist mir nicht ganz klar. Kansnt Du etwas ausformuleiren?

Angenommen du hast eine Kundenliste, nun willst du nur die
Kundenzeilen sehen der Kunden die in Hamburg oder München
wohnen.
Wenn du nun in einer Schleife alle Zellen abklapperst und
prüfst ob der Kunde in Hamburg wohnt und wenn nicht die Zeile
löschst, so hast du dann das problem daß du gar nicht mehr
nach Kunden in München zu suchen brauchst in einer zweiiten
Schleife, weil deren Zeilen schon grad gelöscht wurden.
Also mußt du gleich in der Schleife nach den Zeilen suchen die
„Hamburg“ UND „München“ NICHT enthalten und diese löschen.

Nun, das ist so auch nicht ganz richtig, denn es wird wohl eher die Ausnahme sein, dass ein Kunde in Hamburg UND München wohnt, das heißt letztlich, das wohl kaum eine Zeile gelöscht wird.

Die Lösung kann somit nur sein, in einer Schleife zu prüfen, ob der Kunde, um bei dem Beispiel zu bleiben, in Hamburg ODER München wohnt. Also nicht zwei Schleifen, sondern eine, die bei dem einen Durchlauf von Zelle zu Zelle prüft, ob … oder …

Nimm doch einen Autofilter, filter nach „def“ und kopiere das
Ergebnis raus.

sehr gute Idee, ich würde aber gleich nach „enthält nicht“ (benutzerdefiniert) filtern und die gefilterten Zeilen löschen, dann bleibt das, was soll

LG Marion

Gruß
Reinhard

Hallo Marion,

Also mußt du gleich in der Schleife nach den Zeilen suchen die
„Hamburg“ UND „München“ NICHT enthalten und diese löschen.

Nun, das ist so auch nicht ganz richtig, denn es wird wohl
eher die Ausnahme sein, dass ein Kunde in Hamburg UND München
wohnt, das heißt letztlich, das wohl kaum eine Zeile gelöscht
wird.

leider nein. Meine Aussage bedeutet, daß diejenigen Zeilen gelöscht werden, die weder „Hamburg“ noch „München“ enthalten.

Nimm doch einen Autofilter, filter nach „def“ und kopiere das
Ergebnis raus.

sehr gute Idee, ich würde aber gleich nach „enthält nicht“
(benutzerdefiniert) filtern und die gefilterten Zeilen
löschen, dann bleibt das, was soll

Okay, da kennst du dich besser aus, benutze das wenig :smile:

GuK
Reinhard

Hallo Winter,

ich habe noch nicht registriert, ob dieser Text, den du suchst allein in einer Zelle in der Zeile steht oder Teil einer Zelle ist

ich bin mal bei dem Beispiel mit Hamburg geblieben, das Wort auszuwechseln ist wohl nicht problematisch
es werden alle Zeilen in Tabelle1 gelöscht, die nicht das Wort Hamburg enthalten

Sub bestimmteZeilenLoeschen()
 Sheets("Tabelle1").Activate
 Range("a1").Select

 Do Until IsEmpty(ActiveCell.Value)
 If ActiveCell.Value ("Hamburg") Then
 Selection.EntireRow.Delete
 Else
 ActiveCell.Offset(1, 0).Select
End If
 Loop
End Sub

Gruß
Marion

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Marion, hallo Rainhard,
Danke für Eure Antworten,

Nimm doch einen Autofilter, filter nach „def“ und kopiere das
Ergebnis raus.

sehr gute Idee, ich würde aber gleich nach „enthält nicht“
(benutzerdefiniert) filtern und die gefilterten Zeilen
löschen, dann bleibt das, was soll

Kann ich Autofilter auch in VBA setzten und verwenden? Wußte ich bisher nicht.
Grüße
Winter

Kann ich Autofilter auch in VBA setzten und verwenden? Wußte
ich bisher nicht.

Hallo Winter,

ja, zeichne es mit dem Rekorder auf.

Gruß
Reinhard