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

Zeilen löschen in Abhängigkeit

Forumthread: Zeilen löschen in Abhängigkeit

Zeilen löschen in Abhängigkeit
20.05.2025 14:42:46
Olaf_4
Hallo.
Es geht um Arbeitszeiten und Pausen.

Die Erfassung klappt gut, die Berechnung ebenfalls.
Das Problem: Bei der Berechnung der Pausen fallen Zellen an mit einem Null-Wert. Wird keine Pause gemacht, keine Leerzelle, bei einer Pause eine, bei 2 Pausen 2 Leerzellen
usw. Die Daten habe ich auf ein neues Blatt kopiert, sodass echte Leer-Zeilen anfallen.
Um eine vernünftige Übersicht der Arbeitszeiten zu haben, sollen die Leerzeilen gelöscht werden. Es entsteht dann kein Zwischenraum bei den Arbeitszeiten.

Das Ganze ist dynamisch und unvorhersehbar, da man ja nie weiß, wie viele Pausen an einem Tag gemacht werden.

Fazit: Löschen von Leerzeilen in Abhängigkeit von einem Zellenwert.

Ich möchte das Ganze automatisieren - händisch mit Leerzeilen suchen und manuell löschen ist bei der anfallenden Datenmenge zu aufwendig. Deshalb
gehe ich davon aus, dass hier nur VBA hilft ...

Als Anlage ein Beispiel als Foto - mit meinem Wunsch.
Anzeige

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeilen löschen in Abhängigkeit
20.05.2025 14:45:05
Olaf_4
Userbild
AW: Zeilen löschen in Abhängigkeit
20.05.2025 15:13:20
daniel
Hi
mein persönliches Standardprocedere zum Löschen von Zellen oder Zeilen mit Bedingung ist folgendes:

With ActiveSheet.Usedrange

With .columns(.columns.count + 1)
.FormulaR1C1 = "=IF(...xxx...,0,Row())"
.Cells(1, 1).Value = 0
.EntireRow.RemoveDuplicates .Column, xlno
.clearContents
end with
end with


das Prinzip ist folgenes:
am ende der Tabelle wird eine Formel eingefügt, die für jede Zeile die gelöscht werden soll, eine 0 ausgibt und für jede Zeile, die stehen bleiben soll, die aktuelle Zeilennummer. Wenn man das hat, kann man die Zeilen mit 0 mit dem DuplikateEntfernen schnell und einfach löschen.

du kannst diesen Code für jedes Zeilenlöschen mit Bedingung verwenden, du musst lediglich bei ...xxx... die passende Bedingungsprüfung einsetzen.

Gruß Daniel
Anzeige
AW: Zeilen löschen in Abhängigkeit
22.05.2025 22:28:40
GerdL
Moin
Sub Unit()


With Range(Cells(4, 3), Cells(Rows.Count, 3).End(xlUp)).Offset(, -1)
If WorksheetFunction.CountBlank(.Cells) > 0 Then
.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End If
End With

End Sub

Gruß Gerd
Anzeige
AW: Zeilen löschen in Abhängigkeit
20.05.2025 18:05:53
Olaf_4
Hallo Daniel,

erstmal danke für eine schnelle Antwort.

Habe in deinem Beispiel das "xxx" ersetzt durch D = 0 für Null-Werte in Spalte D.

Das Ganze sieht dann so aus:


Sub Zeilen_loeschen()

With ActiveSheet.UsedRange
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = "=IF(D=0,0,Row())"
.Cells(1, 1).Value = 0
.EntireRow.RemoveDuplicates .Column, xlNo
.ClearContents
End With
End With

End Sub


Es werden jedoch alle Zeilen gelöscht.

Wo liegt der Fahler ... die Sub-Routine musste noch sein, damit überhaupt ein Makro erkannt wird (?)

Gruß
Olaf
Anzeige
AW: Zeilen löschen in Abhängigkeit
21.05.2025 22:35:07
Oppawinni
Naja,
"du kannst diesen Code für JEDES Zeilenlöschen mit Bedingung verwenden"
würde ich jetzt nicht unterschreiben.
Theoretisch wäre ja möglich, dass Used Range bis zur letzten verfügbaren Spalte geht und dann knallt es.
Sauber programmiert ist das also IMHO nicht, wahrscheinlich aber eher wenig problematisch.
Anzeige
AW: Zeilen löschen in Abhängigkeit
21.05.2025 23:04:05
Daniel
Im Prinzip hast du Recht.
Die Frage ist aber, bei welche Excel Anwendung tatsächlich alle Spalten bis zu letzten benötigt werden.
Und ob es bei einer Anwendung, bei der die Usedrange alle Spalten besetzt ohne das diese benötigt werden, nicht erstmal sinnvoller wäre , diesen Fehler zu beheben, anstatt die Programmierung anzupassen.

Wie würdest du das denn programmieren, so dass es "sauber" ist?
Es sollte natürlich ähnlich leistungsfähig sein.
Ich bin gespannt.

Gruß Daniel

Protokollnotiz:
Oppwinni wegen unsinnigen Meckerns in der Sympathieliste auf den letzten Platz setzen
Anzeige
AW: Zeilen löschen in Abhängigkeit
22.05.2025 00:22:07
Oppawinni
Unsinniges Meckern?
Deine Darstellung war doch falsch, oder etwa nicht. Der Fall, dass used range die letzte Spalte einschließt ist zwar wenig wahrscheinlich, aber nicht auszuschließen.
Wie man überprüft, inwieweit used range die letzte Spalte beinhaltet, dürftest du wissen und wie man dann ggf. eine Message auswirft und die weitere Bearbeitung verhindert ebenso ..
Aber wenn du das umsetzt, dann widersprichst du dir ja wieder.... irgendwie, nicht wahr.
Anzeige
AW: Zeilen löschen in Abhängigkeit
22.05.2025 09:12:46
Daniel
Oops, nein weiß ich nicht.
Zeig und, wie es richtig geht.
Oder kannst du doch nur meckern?
AW: Zeilen löschen in Abhängigkeit
22.05.2025 12:31:11
Oppawinni
Mir scheint, dass das einzige Problem ist, dass du mit Kritik nicht umgehen kannst.
AW: Zeilen löschen in Abhängigkeit
22.05.2025 13:22:39
daniel
Doch, ich kann mit Kritik umgehen.
allerdings sollte die Kritik berechtigt und "gut" sein.
eine "gute" Kritik sollte immer über drei Punkte Auskunft geben:
- was wird kritisiert
- warum wird es kritisiert
- wie wäre es besser.

in deinem Fall sprichst du einen Punkt an, der meiner Erfahrung nach in der Realität nicht vorkommt, und wenn doch, liegt der Fehler an einer anderen Stelle, wo er behoben werden sollte, und dann nicht mehr vorkommt.
Daher macht es keinen Sinn, das Makro für einen sowieso nie bis seltenen Fall aufzublähen und damit unnötig zu verkomplizieren. Von daher betrachte ich deine Kritik hier als unberechtigt.
Zumal solche Lösungen von mir eher als beispielhafte Lösungsprinzipen gedacht sind, die der Anwender in seine Programmierung übernehmen und bei Bedarf ergänzen und erweitern kann.
Es ist nicht mein Ansinnen, hier fertige Copy-Paste-Lösungen zu präsentieren, die der Fragesteller ohne eigene Gedankenleistung einfach nur übernehmen kann. Wenn solche vollständigen "Profimäßigen" Lösungen erwünscht und erwartet werden, sollte man die Helfer auch entsprechen für ihre Leistung vergüten.
Anzeige
AW: Zeilen löschen in Abhängigkeit
22.05.2025 14:41:28
Oppawinni
- was wird kritisiert
- warum wird es kritisiert
- wie wäre es besser.
IMHO alles erfüllt.
Deine als "universell" angepriese Lösung ist eben nicht universell.
Wenn dem so wäre, hättest du großer Könner doch nicht erst vor kurzem wieder das Löschen einzelner Zeilen in einer Schleife verkauft, oder?
Anzeige
AW: Zeilen löschen in Abhängigkeit
22.05.2025 16:16:46
daniel
naja, Probleme, die eigentlich nicht vorkommen sondern nur, wenn jemand mit Vorsatz und böser Absicht hinein gebracht werden, dann muss ich die nicht unbedingt betrachten.
Aber versuch mal, die Schleifenlösung anzuwenden, wenn die Tabelle tatsächlich bis zur letzten Zeile gefüllt ist.

und zu deinem letzten Vorwurf, warum sollte nicht auch mal andere Lösungen vorschlagen?
muss es immer die gleich sein?
viele Wege führen nach Rom und die von mir hier gezeigte ist aus meiner persönlichen Erfahrung die beste. Das heißt nicht, das andere Lösungen nicht auch möglich sind.

Anzeige
AW: Zeilen löschen in Abhängigkeit
22.05.2025 16:53:24
Oppawinni
Ach, dass die letzte Zeile gefüllt sein könnte, ist ein Problem, aber dass die letzte Spalte gefüllt sein könnte, ist praktisch ausgeschlossen.... Alles klar...
AW: Zeilen löschen in Abhängigkeit
22.05.2025 16:59:35
daniel
das wird im regelfall auch nicht vorkommen, aber das Makro würde damit funktionieren.
Eine Tabelle mit sehr vielen Zeilen ist halt üblich und kann vorkommen, viele Spalten sind eher selten.
Anzeige
AW: Zeilen löschen in Abhängigkeit
20.05.2025 18:37:27
daniel
"=IF(D=0,0,Row())" ist keine sinnvolle Formel. Was soll hier "D" sein?
die erzeugt bei mir den #Name-Fehler und da alle Zellen diesen Fehler haben, werden auch alle Zeilen gelöscht, bis auf die erste und zweite Zeile.

also da muss eine sinnvolle Formel rein.
damit du die nicht aus dem Kopf schreiben musst, gehe so vor:
schreibe in die erste freie Zelle am Tabellenende ohne an VBA zu denken (also ganz normal mit Excel) eine Formel, die für alle Zellen, die gelöschst werden sollen, eine 0 als Ergebnis hat und für die, die stehen bleiben sollen, die Zeilennummer (Zeile())
also beispielsweise in die Zelle X1: =Wenn(Anzahl2($A1:W1)=0;0;Zeile())
dann ziehst du die Formel nach unten und prüfst, ob sie in allen Fällen das richtige Ergebnis liefert.

um jetzt den richtigen Formeltext für VBA zu bekommen, markierst du eine Zelle mit dieser Formel und gibst im Direktfenster den Befehl ein:
?Replace(Selection.FormulaR1C1, """", """""")
die damit angezeigte Formel kannst du dann in den Code übernehmen.
Das Replace ist erforderlich, wenn die Formel selbst Anführungszeichen enthält. Diese müssen im VBA-Code verdoppelt werden und das mache ich mit dem Replace
Anzeige
AW: Zeilen löschen in Abhängigkeit
21.05.2025 14:34:15
Olaf_4
Hallo Daniel,

ich hab es nicht verstanden ...

Verstanden hab ich dieses: Die Formel. Sie gibt die Zeilennummer aus, wenn Wert in Spalte B > 100 oder = 0 ist. Sie steht in Spalte D, z. B. in Zelle D3.
Das ist überprüft und richtig so für alle Zeilen:


=WENN((ODER(B3>100;B3=0));0;ZEILE())


Wie das letztendlich mit dem VBA funktioniert, um die leeren Zeilen nun zu löschen, hab ich leider nicht verstanden.

Hab verschiedenes nach deinen Angaben gemacht, jedoch alles ohne Erfolg.
Da bin ich absoluter Laie habe ich jetzt festgestellt.

Wäre toll, wenn du die fertige VBA-Vorlage - einfach zum Kopieren - geben könntest.

Hinweis: Das "> 100" in der Formel ist notwendig, weil zum Teil keine echten Nullen vorhamden sind, sondern Verweise von anderen Zellen. Sie haben jedoch
den Wert Null.

Gruß

Olaf

Anzeige
AW: Zeilen löschen in Abhängigkeit
21.05.2025 17:38:52
daniel
die Vorlage zum Kopieren des VBAs hab ich dir doch schon gegeben.
du musst da nur noch die Formel einfügen, in englisch mit R1C1-Adressen.
die zeichnet der Recorder auf, oder du kannst sie wie von mir beschrieben, auslesen, wenn sie in einer Zelle steht.
das solltest du hinbekommen.
Gruß Daniel
Anzeige
AW: Zeilen löschen in Abhängigkeit
21.05.2025 19:13:33
daniel
das Zeilen löschen funktioniert so:

markiere alle Zeilen, die gelöscht werden sollen mit 0 und die, die stehen bleiben sollen, mit der Zeilennummer.
das macht die Formel.

weil jetzt alle Zeilen, die gelöschst werden sollen, in dieser Spalte den selben Wert haben und alle Zeilen, die stehen bleiben sollen, einen eigenen individuellen Wert haben, kann man die Zeilen mit der Menüfunktion DATEN - DATENTOOLS - DUPLIKATE ENTFEREN löschen.

das VBA-Makro macht jetzt nichts weiter, als diese zwei Schritte auszuführen:
1. Formel einfügen
2. Duplikate entfernen
und als dritter Schritt wird noch die Formel in den restlichen Zeilen wieder gelöscht.

also im Prinzip genau so, wie du es von Hand machen würdest, wenn du dich ein bisschen in Excel auskennst.
Gruß Daniel
Anzeige
AW: Zeilen löschen in Abhängigkeit
22.05.2025 00:35:39
Olaf_4
Hallo Daniel,

vielen Dank für deine Hilfe!!

Es hat zwar nicht geklappt mit dem Aufruf der Formel durch VBA, doch ich hab das Prinzip verstanden.

Habe viel gelernt dadurch - z.B. wusste ich vorher nicht, dass es noch andere Möglichkeiten gibt als "A1", "A2", usw.

Das ist spannend jetzt!

Ich habe übrigens die Formel von Piet angepasst - das nur zur Info.

Gruß und danke nochmals,

Olaf
Anzeige
AW: Ende gut, freut mich sehr. Danke für Rückmeldung oWt
22.05.2025 04:02:43
Piet
...
AW: Zeilen löschen in Abhängigkeit
20.05.2025 15:04:36
MCO
Hi!

Also, halbhändisch wäre ja:

Bereich in der Spalte markieren, F5, Inhalte... --> Leerzellen, dann Zellen löschen - ganze Zeile.

Per Makro gehts dann wohl so:

Sub Makro1()

Range("D4:D" & ActiveSheet.UsedRange.Rows.Count).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub


Gruß, MCO
Anzeige
AW: Zeilen löschen in Abhängigkeit
21.05.2025 15:07:10
Piet
Hallo Olaf

probiere bitte mal diesen Code, eine uralte Kamelle, aber sehr zuverlässig.
Der Code benötigt KEINE Formel! - Er prüft ob Spalte B+D Leer oder 0 ist.
Wenn du Zeile2 auch löschen willst musst du bei For Next die 3 auf 2 setzen.
Viel Spass beim testen. Ich bin gespannt auf deinen Rückmeldung.

mfg Piet

Sub Leerzeilen_löschen()

Dim j As Long, lz1 As Long
lz1 = Cells(2000, 3).End(xlUp).Row
For j = lz1 To 3 Step -1
If Trim(Cells(j, 2)) = Empty Or Cells(j, 2) = 0 And _
Trim(Cells(j, 4)) = Empty Or Cells(j, 4) = 0 Then
Rows(j).Delete shift:=xlUp 'Leerzeile löschen
End If
Next j
End Sub
Anzeige
AW: Zeilen löschen in Abhängigkeit
22.05.2025 00:23:35
Olaf_4
Hallo Piet,

vielen Dank für deine Hilfe!

Habe deinen Code so angepasst - ich hoffe, die Kommentare stimmen ...



Sub Leerzeilen_löschen()
Dim j As Long, lz1 As Long
lz1 = Cells(140, 2).End(xlUp).Row 'ab der 140. Zeile, Abhängig von Spalte 2 (in R1C1), also Spalte B
For j = lz1 To 3 Step -1 'von unten nach oben abgearbeitet bis zur 3. Zeile
If Trim(Cells(j, 2)) = Empty Then 'die 2 bedeutet Spalte 2, also B
Rows(j).Delete shift:=xlUp 'Leerzeile löschen
End If
Next j
End Sub


Ich hab viel gelernt -danke!

Gruß
Olaf

Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige