Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1748to1752
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
doppelte Werte filtern
05.04.2020 12:48:40
Peer
Hallo.
ich habe aus dem Netz folgenden Code, den ich gern verstehen möchte.
Sub Vergleich()
Dim iRowA As Integer, iRowB As Integer
Dim iCol As Integer, iColor As Integer
Dim iRowC As Integer
Dim bln As Boolean, blnColor As Boolean
iRowA = 2    ' Beginn Zeile 2
iColor = 2   ' Farbe weiß
Do Until IsEmpty(Cells(iRowA, 1))
iRowB = iRowA + 1
Do Until IsEmpty(Cells(iRowB, 1))
For iCol = 1 To 3
If Cells(iRowA, iCol)  Cells(iRowB, iCol) Then    ' wenn Eintrag in der Zeile
bln = True
Exit For
End If
Next iCol
If bln = False Then
If blnColor = False Then
iColor = iColor + 1  ' rot
End If
If Cells(iRowB, 1).Interior.ColorIndex = _
xlColorIndexNone Then
If Cells(iRowA, 1).Interior.ColorIndex = _
xlColorIndexNone Then
With Worksheets("Doppelt")
iRowC = .Cells(Rows.Count, 1).End(xlUp).Row + 1    ' letzte Zeile?
.Range(.Cells(iRowC, 1), .Cells(iRowC, 3)).Value = _
Range(Cells(iRowB, 1), Cells(iRowB, 3)).Value
End With
End If
Range(Cells(iRowA, 1), Cells(iRowA, 3)). _
Interior.ColorIndex = iColor
Range(Cells(iRowB, 1), Cells(iRowB, 3)). _
Interior.ColorIndex = iColor
blnColor = True
End If
End If
iRowB = iRowB + 1
bln = False
Loop
blnColor = False
iRowA = iRowA + 1
Loop
End Sub

Ein paar Kommentare habe ich schon eingefügt, die aber nicht unbedingt richtig sind.
Der Sub markiert alle doppelten Einträge und markiert sie rot. Anschließend schreibt er die doppelten Werte in die Tabelle "Doppelt".
Ich möchte gern den Code verstehen, um ihn für meine Belange anzupassen.
Folgendes habe ich später vor:
Ich habe die Werte bei mir statt nur in einer Tabelle zusätzlich noch in einer UF bei einer Listbox eingelesen.Über einen Button sollen die doppelten Einträge in der Listbox gefiltert werden, um sie darin zu löschen.
Das ist die Zukunft...
Ich schicke trotzdem mal die Beispiel-Mappe. Es wäre super, wenn sich jemand mit seiner Hilfe am Projekt beteiligt.
https://www.herber.de/bbs/user/136417.xlsm
Vielen Dank.
LG
Peer

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: doppelte Werte filtern
05.04.2020 17:07:35
Nepumuk
Hallo Peer,
schau mal:
Option Explicit

Sub Vergleich()
    Dim iRowA As Long, iRowB As Long
    Dim iCol As Long, iColor As Long
    Dim iRowC As Long
    Dim bln As Boolean, blnColor As Boolean
    iColor = 2 ' Farbe weiß
    For iRowA = 2 To Cells(Rows.Count, 1).End(xlUp).Row 'Schleife von Zeile 2 bis zur letzten (#A)
        For iRowB = iRowA + 1 To Cells(Rows.Count, 1).End(xlUp).Row 'Schleife ab der nächsten Zeile bis zu letzten (#B)
            For iCol = 1 To 3 'Schleife von Spalte 1 bis 3
                If Cells(iRowA, iCol).Value <> Cells(iRowB, iCol).Value Then 'Wenn Eintrag in der Zeile ungleich ist
                    bln = True 'Merker auf True setzen
                    Exit For 'Spaltenschleife verlassen
                End If
            Next iCol
            If Not bln Then 'Wenn der Merker False ist
                If Not blnColor Then 'Wenn der Farbmerker False ist
                    iColor = iColor + 1 'Farbe um eins erhöhen um andere Farbe zu erzeugen
                End If
                If Cells(iRowB, 1).Interior.ColorIndex = xlColorIndexNone Then 'Wenn die Spalte A in Zeile #B nicht gefärbt ist
                    If Cells(iRowA, 1).Interior.ColorIndex = xlColorIndexNone Then 'Wenn die Spalte A in Zeile #A nicht gefärbt ist
                        With Worksheets("Doppelt") 'Verweis auf Tabelle "Doppelte" öffnen
                            iRowC = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'Erste freie Zeile suchen
                            .Range(.Cells(iRowC, 1), .Cells(iRowC, 3)).Value = _
                                Range(Cells(iRowB, 1), Cells(iRowB, 3)).Value 'Werte aus Spalten A-C in Zeile #B übertragen
                        End With
                    End If
                    Range(Cells(iRowA, 1), Cells(iRowA, 3)). _
                        Interior.ColorIndex = iColor 'Zellen (A-C) in Zeile #A färben
                    Range(Cells(iRowB, 1), Cells(iRowB, 3)). _
                        Interior.ColorIndex = iColor 'Zellen (A-C) in Zeile #B färben
                    blnColor = True 'Farbmerker auf True setzen damit bei weiteren Fundstellen die Farbe nicht geändert wird
                End If
            End If
            bln = False 'Merker auf False setzen
        Next iRowB
        blnColor = False 'Farbmerker auf False setzen um beim nächsten Fund die Farbe zu ändern
    Next iRowA
End Sub

Gruß
Nepumuk
Anzeige
AW: doppelte Werte filtern
05.04.2020 18:54:05
Peer
Hallo Nepumuk.
Danke für deine Hilfe.
Dann werde ich mich mal über den Code her machen und hoffe, dass ich ihn verstehe und meinen Bedürfnissen anpassen kann.
LG
Peer
AW: doppelte Werte filtern
05.04.2020 21:00:56
Peer
Hallo.
Ich habe noch Fragen zum Code?
Wie deute ich iRowA und iRowB? Und warum/für was brauche ich den Merker bln bzw. blnColor?
LG
Peer
AW: doppelte Werte filtern
06.04.2020 08:44:43
Nepumuk
Hallo Peer,
in der Liste gibt es nur einen Doppelten, nämlich Lauermann.
iRowA läuft von Zeile 2 bis zur letzten Zeile.
iRowB läuft immer von einer Zeile darunter bis zur letzten Zeile.
bln bleibt False wenn ein doppelter Eintrag gefunden wurde.
blnColor wird auf True gesetzt wenn ein doppelter Eintrag gefärbt wurde damit die Farbe nicht geändert wird sollte ein weiterer Eintrag gefunden werden der mit dem Eintrag aus iRowA gefunden wird.
Gruß
Nepumuk
Anzeige
AW: doppelte Werte filtern
06.04.2020 08:58:56
Peer
Hallo Nepumuk.
Danke für deine kurze Erläuterung. Kann ich das so vertehen, dass iRowA der Quellwert der Suche und iRowB der Vergleichswert der Suche ist?
Ein Problem besteht weiterhin.
Lauermann wird nicht rot markiert und erscheint daher auch nicht in Tabelle "Doppelt". Ich hatte Landa manuell doppelt hinzugefügt, die auch als doppelter Eintrag gefunden und rot markiert wurde.
Dann habe ich den doppelten Eintrag von Landa entfernt und seitdem ist der übrig gebliebene Eintrag von Landa rot, auch nach dem Neustart der Mappe. Alle anderen doppelten Einträge, wie Lauermann werden nicht gefunden. Warum nicht?
Wird beim Start des Sub nicht alle Zeilen auf weiß gestellt?
Hast du eine Erklärung für mich?
LG
Peer
Anzeige
AW: doppelte Werte filtern
06.04.2020 09:12:06
Nepumuk
Hallo Peer,
1. Ja das ist richtig.
2. Bei mir wird Lauermann rot markiert.
3. Nein, das wird bisher nicht gemacht, das kannst du aber leicht ergänzen:
Columns("A:C").Interior.ColorIndex = xlColorIndexNone

Gruß
Nepumuk
AW: doppelte Werte filtern
06.04.2020 09:29:55
Peer
Hallo Nepumuk.
Ich habe die Zeile am Anfang gesetzt. Jetzt wurde der alte "Rote" Eintrag resettet und Lauermann wurde auch gefunden und rot markiert. Nun aber wurde der zweite, von mir eingefügte, doppelte Eintrag gefunden und grün gefärbt (iColor + 1). Der erste gefundene (rote) Eintrag wurde doppelt in Tabelle "Doppelt geschrieben und der zwiete (grüne) ebenfalls, aber einfach, in selbige Tabelle geschrieben. Der alte Eintrag Landa ist in Tabelle "Doppelt" geblieben.
Ich schicke dir nochmal die Mappe, um zu sehen, was ich meine. Es wäre lieb von dir, wenn du nochmal drüber schauen würdest.
https://www.herber.de/bbs/user/136438.xlsm
LG
Peer
Anzeige
AW: doppelte Werte filtern
06.04.2020 09:35:07
Nepumuk
Hallo Peer,
die Liste "Doppelt" wird nicht gelöscht, das musst du selber einbauen.
Gruß
Nepumuk
AW: doppelte Werte filtern
06.04.2020 10:04:05
Peer
Hallo Nepumuk.
Ich habe vor den Beginn der Schleifen es mit..
Worksheets("Doppelt").Range("A2:C").ClearContents
...versucht, aber der Debugger bemängelt es.
auch

ActiveWorkbook.Worksheets("Doppelt").Range("A2:C").ClearContents
hilft nicht.
Gedankenfehler?
Gruß
Peer
Range("A2:C")- zB. Range("A2:C100")
06.04.2020 10:20:32
Helmut
AW: Range("A2:C")- zB. Range("A2:C100")
06.04.2020 10:27:48
Peer
Dies ist die einfachste Lösung. Aber gibt es auch eine Lösung, wo ab Zeile 2 alle Einträge entfernt werden (zb. EntireRows)?
Anzeige
AW: Range("A2:C")- zB. Range("A2:C100")
06.04.2020 10:47:08
Nepumuk
Hallo Peer,
einfach so:
With Worksheets("Doppelt")
    .Range(.Cells(2, 1), .Cells(.Rows.Count, 3)).ClearContents
End With

Gruß
Nepumuk
AW: Range("A2:C")- zB. Range("A2:C100")
06.04.2020 11:14:01
Peer
Hallo Nepumuk.
Genau so dachte ich es mir. Danke.
LG
Peer

102 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige