Herbers Excel-Forum - das Archiv

Makro: Falls in einer Zelle "0" Zeile löschen

Bild

Betrifft: Makro: Falls in einer Zelle "0" Zeile löschen
von: bion

Geschrieben am: 19.12.2006 14:36:41
Hallo!
Ich habe von Makroprogrammierung leider keine Ahnung, könnte aber dringend eines gebrauchen:
Es so schauen, ob in der Zelle B2 eine "0" ist und falls ja die Zeile löschen, falls nicht in die nächste Zeile springen und das gleiche tun - bis zum Ende der Tabelle.
Ich würde das mit einer Schleife und einer IF-Abfrage machen, aber leider kenne ich die VBA Befehle nicht. Für Hilfe wäre ich sehr dankbar!
Gruß,
Bion
Bild

Betrifft: AW: Makro: Falls in einer Zelle "0" Zeile löschen
von: Rudi Maintaire
Geschrieben am: 19.12.2006 14:43:34
Hallo,
bemüh doch mal die Suche. 4070 Treffer für Zeile löschen.
Gruß
Rudi
Eine Kuh macht Muh, viele Kühe machen Mühe
Bild

Betrifft: AW: Makro: Falls in einer Zelle "0" Zeile löschen
von: UweD

Geschrieben am: 19.12.2006 14:49:26
Hallo
prüft nur auf Null, Wenn Zelle leer ist, bleibt die Zeile drin...
Man geht die Sache aber am besten von hinten nach vorne an...
Sub NullRaus()
On Error GoTo Fehler
Dim SP%, ZE&, LR&, TB1, i&
Set TB1 = ActiveSheet
SP = 2 'Spalte B
ZE = 2 'Zeile 2
LR = TB1.Cells(Rows.Count, SP).End(xlUp).Row 'letzte Zeile der Spalte
Application.ScreenUpdating = False
For i = LR To ZE Step -1
If TB1.Cells(i, SP).Value <> "" And TB1.Cells(i, SP).Value = 0 Then
TB1.Rows(i).EntireRow.Delete
End If
Next
Fehler:
If Err.Number <> 0 Then MsgBox "Fehler: " & Err.Number & vbLf & Err.Description: Err.Clear
Application.ScreenUpdating = True
End Sub

Gruß UweD
(Rückmeldung wäre schön)
Bild

Betrifft: AW: Makro: Falls in einer Zelle "0" Zeile löschen
von: bion
Geschrieben am: 19.12.2006 15:14:34
Super, das klappt. Vielen Dank! Jetzt muss ich nur noch abwarten, bis meine 60000 Zeilen abgearbeitet sind.
Bild

Betrifft: AW: Makro: Falls in einer Zelle "0" Zeile löschen
von: Luc:-?
Geschrieben am: 19.12.2006 15:00:10
Hallo Bion,
hier ist auch noch was Vglbares.
Gruß Luc :-?
Bild

Betrifft: 0 Zeilen filtern und löschen per Code
von: Beate Schmitz

Geschrieben am: 19.12.2006 16:00:00
Hallo Bion,
wenn in Zeile1 Überschriften liegen geht das sehr schnell:
Sub Null_Zeilen_loeschen_mit_Autofilter()
'Voraussetzung: Liste beginnt in Zeile 1 (Überschriften)
With ActiveSheet.UsedRange ' This Will Take The Whole Cells In The Active Sheet...
    .AutoFilter Field:=2, Criteria1:="0" ' Everything 0
    .Offset(1, 0).Resize(.Rows.Count, .Columns.Count). _
        SpecialCells(xlCellTypeVisible).Delete Shift:=xlUp
    .AutoFilter
End With
End Sub


Gruß,
Beate
Bild

Betrifft: Achtung AutoFilter-Problem bei vielen Zeilen
von: Daniel Eisert

Geschrieben am: 19.12.2006 19:48:24
Hallo
ich glaube es wurden gerade 60.000 Zeilen erwähnt.
Da wird die Schleife ne weile brauchen und der Autofilter hat das Problem, daß er bei vielen Zeilen (bei mir so ab c.a. 35000) einfach alles löscht, egal ob sichtbar oder nicht.
Ne lösung dafür wäre, die Daten vor dem Filtern und löschen zu SORTIEREN, so daß alle zu löschenden Zeilen LÜCKENLOS untereinander stehen.
Dann hat Excel auch kein Problem mit den vielen Zeilen und es geht superschnell.
dh, Code für Löschen mit Autofilter so modifieren:
Sub Null_Zeilen_loeschen_mit_Autofilter()
'Voraussetzung: Liste beginnt in Zeile 1 (Überschriften)
With ActiveSheet.UsedRange ' This Will Take The Whole Cells In The Active Sheet...
.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
.AutoFilter Field:=2, Criteria1:="0" ' Everything 0
.Offset(1, 0).Resize(.Rows.Count, .Columns.Count). _
SpecialCells(xlCellTypeVisible).Delete Shift:=xlUp
.AutoFilter
End With
End Sub

nach dem Löschen kannst du dann ja wieder in die alte Reihenfolge zurücksortieren (so es eine gibt)
Gruß, Daniel
Bild

Betrifft: Anderer Ansatz
von: Beate Schmitz


Geschrieben am: 19.12.2006 20:05:55
Hallo Daniel,
diese Beschränkung kannte ich nicht - aber stimmt! Danke.
Hier noch eine schnelle Lösung, insofern bisher keine Leerzellen in Spalte B sind:
Sub Null_Zeilen_loeschen()
'geht nur richtig, wenn keine Leerzellen in Spalte B sind!
'die würden sonst ungewollt mitgelöscht
Columns("B:B").Replace 0, "", xlWhole
Columns("B:B").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub



Gruß,
Beate
Bild

Betrifft: AW: Anderer Ansatz - gleiches Problem
von: Daniel Eisert

Geschrieben am: 19.12.2006 20:31:45
Hallo
auch ne sehr elegante Lösung, wenn keine anderen Leerzellen vorhanden sind, die eigentlich stehen bleiben sollen.
Allerdings besteht hier das gleiche Problem, ab einer bestimmten Zeilenzahl wird die Funktion langsam oder stürzt sogar ganz ab.
Ursache ist aber auch hier wieder nicht die Menge der der Zeilen, sondern die Aufsplitterung.
dh. auch hier sollte vorher sortiert werden.
Sind die Zeilen sortiert, so daß alle zu löschenden Zeilen lückenlos beisammen stehen, gehts rasend schnell, dann spielt die Anzahl der Zeilen fast keine Rolle mehr.
Wer will, kann die verschiedenen Methoden (Schleife, Specialcells) hier mal ausprobieren.
https://www.herber.de/bbs/user/39118.zip
Gruß, Daniel
Bild

Betrifft: Replace-Makro zum Zeilenlöschen
von: Beate Schmitz

Geschrieben am: 20.12.2006 10:44:16
Hallo Daniel,
das Replace-Makro läuft bei mir problemlos auch ohne Sortierung. Mag ja an der Excel Version liegen.
Wenn man das Makro so modifiziert, bleiben auch Zeilen erhalten, die leer in Spalte B sind:
Sub Null_Zeilen_loeschen2()
'so geht es auch mit Leerzellen im Bereich, wenn deren Zeilen erhalten
'bleiben sollen. vorher die Leerzellen in einen String ändern,
'der ansonsten nicht in der Spalte vorkommt;
'nach 0-Zellen Löschung werden diese Zellen dann wieder in Leerzellen
'gewandelt
Columns("B:B").Replace "", "#", xlWhole
Columns("B:B").Replace 0, "", xlWhole
Columns("B:B").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Columns("B:B").Replace "#", "", xlWhole
End Sub

Danke für deine Beispieldatei.
Gruß,
Beate
Bild

Betrifft: AW: Replace-Makro zum Zeilenlöschen
von: Daniel Eisert

Geschrieben am: 21.12.2006 00:49:39
Hallo
der Replace ist ja auch nicht das Problem.
die Delete-Funktion kommt ins Stocken, wenn zuvielen Einzelzellen selektiert sind.
Könnte natürlich auch ein Speicherplatz- abhängiges Problem sein
gruß, Daniel
Bild

Betrifft: Anderer Ansatz
von: Beate Schmitz
Geschrieben am: 19.12.2006 20:05:55
Hallo Daniel,
diese Beschränkung kannte ich nicht - aber stimmt! Danke.
Hier noch eine schnelle Lösung, insofern bisher keine Leerzellen in Spalte B sind:
Sub Null_Zeilen_loeschen()
'geht nur richtig, wenn keine Leerzellen in Spalte B sind!
'die würden sonst ungewollt mitgelöscht
Columns("B:B").Replace 0, "", xlWhole
Columns("B:B").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub



Gruß,
Beate
 Bild