captnhowdy
Goto Top

Excel - Duplikate vergleichen und entfernen

Hallo Community,

ich bin auf der Suche nach einer Lösung für angehängtes Bild.

Hierbei sind Duplikate ZEILE 2 & 3
ZEILE 9 & 10
ZEILE 27 & 28
vorhanden.
Es soll der Wert in Spalte "I" mit dem dazugehörigen Duplikate verglichen werden. Die Zeile mit dem niedrigeren Wert aus Spalte "I" soll entfernt werden.

Hat jemand nen Lösungsvorschlag? Gerne auch einen VBA Code face-smile

Für Eure Mühe, vielen Dank im voraus.
unbenannt

Content-ID: 434628

Url: https://administrator.de/contentid/434628

Ausgedruckt am: 16.11.2024 um 03:11 Uhr

138810
138810 30.03.2019 aktualisiert um 14:28:10 Uhr
Goto Top
Hi,
sind es immer maximal 2 Duplikate und stehen diese immer direkt untereinander?

In dem Fall:
Sub KleinstesDuplikatEntfernen()
    Dim rCell As Range, rDel As Range, rDup As Range, lineCurrent as String, lineNext as String
    With ActiveSheet
        Set rCell = .Range("A2")  
        While rCell <> ""  
            lineCurrent = rCell.Value & rCell.Offset(0, 1).Value & rCell.Offset(0, 2)
            lineNext = rCell.Offset(1, 0).Value & rCell.Offset(1, 1).Value & rCell.Offset(1, 2)
            If lineCurrent = lineNext Then
                Set rDup = IIf(rCell.Offset(0, 3).Value <= rCell.Offset(1, 3).Value, rCell.EntireRow, rCell.Offset(1, 0).EntireRow)
                If Not rDel Is Nothing Then
                    Set rDel = Union(rDel, rDup)
                Else
                    Set rDel = rDup
                End If
            End If
            Set rCell = rCell.Offset(1, 0)
        Wend
        If Not rDel Is Nothing Then
            rDel.Delete
        End If
    End With
End Sub

Gruß freesolo
CaptnHowdy
CaptnHowdy 30.03.2019 um 14:55:12 Uhr
Goto Top
Hi freesolo,
innerhalb der Personalnummer stehen Sie leider nicht untereinander. es können bis zu mehr als 2 Duplikate vorkommen. Mehr als 3 habe ich noch nicht gesehen.
138810
Lösung 138810 30.03.2019 um 14:57:05 Uhr
Goto Top
Zitat von @CaptnHowdy:

Hi freesolo,
innerhalb der Personalnummer stehen Sie leider nicht untereinander. es können bis zu mehr als 2 Duplikate vorkommen. Mehr als 3 habe ich noch nicht gesehen.
Und du willst nur die Zeile löschen die am geringsten ist. Was soll dann deiner Meinung nach geschehen wenn es mehr wie 2 sind? Die Zeile mit dem größten Wert stehen lassen und alle anderen löschen oder was?
CaptnHowdy
CaptnHowdy 30.03.2019 um 15:10:55 Uhr
Goto Top
korrekt. Sorry wenn ich mich hier nicht klar ausgedrückt habe, und die Ausnahmen nicht bedacht habe. Ich könnte aber die Datei aufbereiten und die einzelnen Felder verketten, und diese dann sortieren. Ich denke da komm ich auch gut zum Ziel damit. Genial, danke für deine erneute Hilfe!
138810
Lösung 138810 30.03.2019 aktualisiert um 15:56:19 Uhr
Goto Top
OK, in dem Fall kannst du hiermit arbeiten wenn du es noch gebrauchen kannst, Anzahl Duplikate ist egal lässt immer nur den mit dem größten Wert in Spalte D übrig:
Sub DuplikateEntfernen()
    Dim rDel As Range, lngLastRow As Long, lineCurrent As String, lineNext As String, cnt As Integer, cell As Range
    With ActiveSheet
        lngLastRow = .Cells(Rows.Count, "A").End(xlUp).Row  
        With .Sort
            .SortFields.Clear
            .SetRange ActiveSheet.Range("A1:D" & lngLastRow)  
            .Header = xlYes
            .SortFields.Add Key:=ActiveSheet.Range("A2:A" & lngLastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal  
            .SortFields.Add Key:=ActiveSheet.Range("B2:B" & lngLastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal  
            .SortFields.Add Key:=ActiveSheet.Range("C2:C" & lngLastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal  
            .SortFields.Add Key:=ActiveSheet.Range("D2:D" & lngLastRow), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal  
            .Apply
        End With
        For Each cell In .Range("A2:A" & lngLastRow)  
            lineCurrent = cell.Value & cell.Offset(0, 1).Value & cell.Offset(0, 2)
            lineNext = cell.Offset(1, 0).Value & cell.Offset(1, 1).Value & cell.Offset(1, 2)
            cnt = 1
            While lineCurrent = lineNext
                If Not rDel Is Nothing Then
                    Set rDel = Union(rDel, cell.Offset(cnt, 0).EntireRow)
                Else
                    Set rDel = cell.Offset(cnt, 0).EntireRow
                End If
                cnt = cnt + 1
                lineNext = cell.Offset(cnt, 0).Value & cell.Offset(cnt, 1).Value & cell.Offset(cnt, 2)
            Wend
        Next
        If Not rDel Is Nothing Then
            rDel.Delete
        End If
    End With
End Sub
Schönes Wochenende noch.
CaptnHowdy
CaptnHowdy 31.03.2019, aktualisiert am 01.04.2019 um 12:46:30 Uhr
Goto Top
Wow, das ist ja ne Meisterarbeit. Ich werde es morgen direkt testen und gebe dir bescheid . Ich sag schon mal tausend Dank für deine Mühe. Schaut schon heftig aus. Da hast Du sicherlich viel Zeit investiert.

Nachtrag: Das Makro läuft gerade. Wird hier nur das aktive Tablellenblatt bearbeitet oder die ganze Mappe?