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

Löschen von bestimmten doppelten Zeilen (Blöcke)

Forumthread: Löschen von bestimmten doppelten Zeilen (Blöcke)

Löschen von bestimmten doppelten Zeilen (Blöcke)
10.02.2025 14:53:24
Klaus
Hallo Freunde,
ich hab ein Problem mit doppelten Zeilen (Blöcken), ein Beispiel ist in der Datei.
Zeilen 3-11 und 22-30 sind doppelt wobei der untere Block (Zeilen) gelöscht werden soll. Die Anzahl der Zeilen innerhalb der Blöcke, und auch die Reihenfolge ist variabel.
Verglichen werden sollen die Werte in Spalte A, wenn hier doppelte Werte vorkommen (z.B. A3:A4 und A22:A23), dann muss der zugehörige Block (ganze Zeilen) gelöscht werden. Die Blöcke sind nur für das Beispiel farblich markiert.
Wie kann man das realisieren?
https://www.herber.de/bbs/user/175593.xlsm
Vielen Dank schon im voraus.
Gruß Klaus
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Löschen von bestimmten doppelten Zeilen (Blöcke)
10.02.2025 15:32:57
Yal
Hallo Klaus,

dafür müsste man die Regel sicherstellen, die beschreiben, was der Anfang und was das Ende eines Blockes definiert. Erst wenn man die Blocke eindeutig identifiziert hat, kann man diese miteinander vergleichen.

Wie es aussieht, gibt es innerhalb eines Blockes eine Gruppierung von 3 Zeilen: erste Zeile hat eine Menge ("qty"), dann 2 leere Zellen in Spalte "qty". Dementsprechend wäre der Block-Anfang die Gruppierung mit einer Wert in Spalte A. Letzte Gruppierung ist die Gruppierung vor dem Start von nächsten Block.
"Letzte Zeile" -und dementsprechend letzte Gruppierung- ist durch die letzte befüllte Zelle in Spalte B definiert.

Oder haben die Blöcke ganz einfach immer 9 Zeilen? (nein, schon beantwortet: Anzahl der Zeilen innerhalb der Blöcke ist variable)

Problem macht die Zeile 12, weil diese eine eigene Definition hat. Wie könnte man diese isolieren? Kann man aus der Länge der Text in Spalte A etwas ablesen?

VG
Yal


Anzeige
AW: Löschen von bestimmten doppelten Zeilen (Blöcke)
10.02.2025 19:45:10
Daniel
Hi
hier bietet sich an, die zu löschenden Zeilen zuerst per Formel zu markieren und dann die markierten Zeilen zu löschen:

Sub löschen()

With ActiveSheet.UsedRange
With Columns(.Columns.Count + 1).Resize(.Rows.Count - 1, 1).Offset(1, 0)
.FormulaR1C1 = "=IF(RC1="""",R[-1]C,IF(ROW(RC1)=MATCH(RC1,C1,0),"""",1))"
.Formula = .Value
If WorksheetFunction.Sum(.Cells) > 0 Then .SpecialCells(xlCellTypeConstants, 1).EntireRow.Delete
End With
End With
End Sub

Code getestet mit deiner Beispieldatei.
Gruß Daniel
Anzeige
AW: Löschen von bestimmten doppelten Zeilen (Blöcke)
10.02.2025 16:44:27
Klaus
Hallo Yal,
danke für den Denkansatz. Mir ist noch etwas aufgefallen: die doppelten Blöcke stehen immer "unten".
D.h. so müsste es dann logisch sein:
1. verschieben von Zeilen an Hand von Spalte D (wenn Wert "no findings", dann Zeile nach oben schieben)
2. suche von unten in Spalte A die erste "nicht leere" Zelle
3. wenn dieser Wert weiter oben gefunden wird, dann lösche alle Zeilen von der letzten bis hoch zur ersten nicht leeren Zelle +1
4. wiederhole Schritte 2. bis 3. solange bis keine Übereinstimmung gefunden wird

Unter dieser Prämisse: wie muss der Code denn dann aussehen?

Gruß Klaus
Anzeige
AW: Löschen von bestimmten doppelten Zeilen (Blöcke)
10.02.2025 17:12:02
Yal
Hallo Klaus,

ich habe mich inzwischen für eine andere Strategie:
- eine "Gruppe" hat 3 Zeilen, die erste davon hat eine "Menge" (Spalte C)
- ein Sonderblock hat ein Eintrag in Spalte A, aber keine Menge
- eine erste Gruppe hat in Spalte A 3 Zellen übereinander mit dem Muster Text-Text-Leer

Blöcke werden mit Namen gespeichert, wenn Name wieder vorkommt, bisherige Gruppe wird als "zulöschen" gespeichert. Am Ende alle en Block gelöscht. Letzteres muss tatsächlich auf einmal stattfinden, da sonst einen Zeilenverschiebung stattfinden könnte.

Public Sub DoppelteBlock_löschen()

Dim D As Object
Dim z As Long
Dim Hat_Menge As Boolean
Dim Ist_SonderBlock As Boolean
Dim Hat_TTL As Boolean 'Eine Gruppe
Dim BlockStartZeile As Long
Dim BlockName As String
Dim ZuLöschen As String

Set D = CreateObject("Scripting.Dictionary")
With Worksheets("template")
z = .Cells(Rows.Count, "B").End(xlUp).Row
BlockStartZeile = z + 1
Do While z > 2
'Prüfungen
Hat_Menge = .Cells(z - 2, "C").Value > "" 'von akt. Zeile, 2 Zeile nach Oben, Spalte "C"
Ist_SonderBlock = .Cells(z, "A").Value > "" And Not Hat_Menge
Hat_TTL = .Cells(z, "A").Value = "" And .Cells(z - 1, "A").Value > "" And .Cells(z - 2, "A").Value > ""
'Evaluieren der Prüfwerte
If Ist_SonderBlock Then 'Sonderblock
BlockStartZeile = z
z = z - 1 'SEHR WICHTIG gegen endlose Schleifen
ElseIf Hat_Menge And Hat_TTL Then 'erster Gruppe, also BlockStart
BlockName = Trim(Cells(z - 2, "A").Value)
'wenn schon einen Block mit diesen Name
If D.Exists(BlockName) Then ZuLöschen = ZuLöschen & "," & D(BlockName)
D(BlockName) = (z - 2) & ":" & (BlockStartZeile - 1)
BlockStartZeile = z - 2
z = z - 3 'SEHR WICHTIG gegen endlose Schleifen
Else 'einfache Gruppe
z = z - 3 'SEHR WICHTIG gegen endlose Schleifen
End If
Loop
If ZuLöschen > "" Then .Range(Mid(ZuLöschen, 2)).Delete
End With
End Sub


VG
Yal
Anzeige
AW: Löschen von bestimmten doppelten Zeilen (Blöcke)
11.02.2025 09:30:59
Klaus
Hallo Yal, Daniel,
vielen Dank euch beiden. Es funktionieren beide Versionen genau wie ich es benötige.
Gruß Klaus

Forumthreads zu verwandten Themen