Beitrag aus dem Excel-Forumsarchiv
Home Zur Übersicht    
Thema: Makro um doppelte Einträge zu suchen und zu filtern

Betrifft: Makro um doppelte Einträge zu suchen und zu filtern
von: Excelneuling2
Geschrieben am: 31.07.2010 16:39:31

Hallo Zusammen,

ich bin ein Excelneuling und habe dementsprechend noch nie ein Makro programmiert und hoffe auf Hilfe.

Mein Problem:

Ich habe eine Datenbank (siehe Beispieltabelle) in der x Zeilen und y Spalten vorhanden sind. Ich möchte ein Makro schreiben, welches doppelte Zeilen erkennt und die zweite davon löscht und "nach oben verschiebt", sodass keine Leerspalten entstehen.
Eine "doppelte Zeile" ist dann gegeben wenn in Zeile i und Zeile i+1 der gleiche Zahlenwert steht und zwar in jeder Spalte (die Wertepaare müssen dabei nur über die Zeilen identisch sein, nicht aber zwingend über die Spalten), dann soll auch über alle Spalten die gesamte Zeile i+1 (also der jeweils zweite Eintrag der doppelten Zeilen) gelöscht werden.

Beispiel:

1 2 10
2 3 9
3 4 8
4 5 7
5 6 6
6 7 5
6 7 5
7 8 4
8 9 3
9 10 2
10 1 1
10 1 1
11 12 12
12 13 13

Im Beispiel sollte also Zeile 7 und 12 gelöscht und nach oben verschoben werden. (14 Zeilen, 3 Spalten im Beispiel).

Wäre toll wenn mir da jemand weiter helfen könnte.

beste grüße, basti

P.S.: Ich benutzte Excel 2003
Beitrag bearbeiten/löschen

  

Betrifft: Crosspost
von: Backowe
Geschrieben am: 31.07.2010 16:44:49

http://www.ms-office-forum.net/forum/showthread.php?t=267810


  

Betrifft: AW: Crosspost
von: Hajo_Zi
Geschrieben am: 31.07.2010 16:48:11

Hallo Jürgen,

da wird er ja bald geschlossen, falls Du da auch drauf hingewiesen hast.

Gruß Hajo


  

Betrifft: AW: Makro um doppelte Einträge zu suchen und zu filtern
von: Hajo_Zi
Geschrieben am: 31.07.2010 16:46:16

Hallo Basti,

ich hätte eigentlich Zeile 6 gesehen. Warum Zeile 12 in der nachfolgenden Zeile steht doch nichts?

Doppelte Löschen
angenommen Deine Daten stehen in A1 bis A????
Bereich markieren = Spalte A anklicken (evtl. eine Leerzeile vorher einfügen)
Daten / Filter / Spezialfilter
keine Duplikate
jetzt kannst du noch einstellen, ob an gleicher Stelle oder woanders placiert; hier also B1 eingeben
Spalte A anschließend löschen
Bei mehreren Spalten, muss die Liste eine Überschrift haben, am besten fett formatiert, dann erkennt sie auch Excel als Überschrift.

GrußformelHomepage


  

Betrifft: AW: Makro um doppelte Einträge zu suchen und zu filtern
von: ransi
Geschrieben am: 31.07.2010 23:27:49

HAllo Basti

Sehen deine Daten so aus ?
Tabelle1

 ABCD
11210 
2239 
3348 
4457 
5566 
6675 
7675 
8784 
9893 
109102 
111011 
121011 
13111212 
14121313 
15    


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4

Wenn ja, versuch mal dies:


' **********************************************************************
' Modul: Tabelle1 Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit


Public Sub test()
Dim myDic As Object
Set myDic = CreateObject("Scripting.Dictionary")
Dim arr As Variant
Dim L As Long
With Sheets("TAbelle1")
    .Range("A1").CurrentRegion.Copy
    arr = Split(Lesen, vbCrLf)
    For L = LBound(arr) To UBound(arr)
        myDic(arr(L)) = 0
    Next
    schreiben (Join(myDic.keys, vbCrLf))
    .Range("A1").CurrentRegion.Clear
    .Paste .Range("A1")
    .Range("A1").Delete shift:=xlToLeft
End With
End Sub



Public Function Lesen()
Dim IE As Object
On Error Resume Next
Set IE = CreateObject("HTMLfile")
Lesen = IE.ParentWindow.ClipboardData.GetData("text")
Set IE = Nothing
End Function



Public Sub schreiben(DerText As String)
Dim IE As Object
Set IE = CreateObject("HTMLfile")
IE.ParentWindow.ClipboardData.SetData "text", Chr(32) & DerText & Chr(32)
Set IE = Nothing
End Sub



Ausgabe ist dann dies:
Tabelle1

 ABC
11210
2239
3348
4457
5566
6675
7784
8893
99102
101011
11111212
12121313


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4


ransi


  

Betrifft: AW: Makro um doppelte Einträge zu suchen und zu filtern
von: Drogist
Geschrieben am: 01.08.2010 12:54:54

Hallo basti,

ich habe da eine Lösung in VBA, die für Einsteiger recht gut durchschaubar ist, wenn grundlegende Programmierkenntnisse vorliegen. Grundlage für das Makro ist deine Vorgabe, dass die Werte in mehren Spalten und Zeilen bereits in einer Tabelle vorhanden sind:

Sub DelDuplicate()
    Dim LastRow As Long
    Dim LastCol As Long
    Dim x1 As Long, x2 As Long
    Dim y1 As String, y2 As String
    Dim i As Long, k As Long
    
    'Größe des zusammenhängenden Bereichs feststellen
    Cells(1, 1).Select
    LastRow = Selection.End(xlDown).Row
    Cells(1, 1).Select
    LastCol = Selection.End(xlToRight).Column
    
    For i = LastRow To 2 Step -1
        x1 = Cells(i, 1).Value
        x2 = Cells(i - 1, 1).Value
        If x1 = x2 Then
            y1 = x1
            For k = 2 To LastCol
                y1 = y1 & Cells(i, k)
            Next k
            y2 = x2
            For k = 2 To LastCol
                y2 = y2 & Cells(i - 1, k)
            Next k
            
            If y1 = y2 Then
                Range(Cells(i, 1), Cells(i, LastCol)).Delete Shift:=xlUp
            End If
        End If
    Next i
End Sub
Diese Lösung klappt, wenn immer die gleiche Anzahl von Spalten gefüllt sind. Ich sehe aber folgendes Problem: Wenn in Zeile 12 (die 2. Zehner) folgendes steht 10 | 11 | (leer), dann wird zwar die gleiche Zeichenfolge im Vergleichs-String sein aber die beiden Zeilen stimmen dennoch nicht überein. Falls das vorkommen kann, dann verwende diesen Code:
Sub DelDuplicate2()
    Dim LastRow As Long
    Dim LastCol As Long
    Dim x1 As Long, x2 As Long
    Dim y1 As String, y2 As String
    Dim i As Long, k As Long
    
    Cells(1, 1).Select
    LastRow = Selection.End(xlDown).Row
    Cells(1, 1).Select
    LastCol = Selection.End(xlToRight).Column
    
    For i = LastRow To 2 Step -1
        x1 = Cells(i, 1).Value
        x2 = Cells(i - 1, 1).Value
        If x1 = x2 Then
            y1 = x1
            For k = 2 To LastCol
                y1 = y1 & "-" & Cells(i, k)
            Next k
            y2 = x2
            For k = 2 To LastCol
                y2 = y2 & "-" & Cells(i - 1, k)
            Next k
            
            If y1 = y2 Then
                Range(Cells(i, 1), Cells(i, LastCol)).Delete Shift:=xlUp
            End If
        End If
    Next i
End Sub
Wie du den Code in eine Excel-Datei einbindest und danach ausführst, kannst du an verschiedenen Stellen nachlesen.


Beste Grüße

Drogist


  

Betrifft: AW: Makro um doppelte Einträge zu suchen und zu filtern
von: Excelneuling2
Geschrieben am: 01.08.2010 15:19:12

Hallo Drogist,

ersteinmal vielen Dank für deine schnelle und sehr ausführliche Antwort trotz crossposting meinerseits.

@all: Was das Crossposting anbelangt gelobe ich Besserung, ich sehe ein, dass bei so viel kompetenter Unterstützung in diesem Forum doppelte "Arbeit" wirklich nicht sein muss! Alle die sich dadurch auf den Schlips getreten fühlten bitte ich ernsthaft um Entschuldigung!!!

@drogist:

Das Einbinden und ausführen deines Codes hat tadellos funktioniert und das gewünschte Ergebnis erzeugt, einfach toll :)

Zu deinem Einwand mit den leeren Zeilen: Leere Zeilen kommen nicht vor. Wenn ich das richtig verstanden habe wandelt dein Code alle Zeilenzeichen in einen String und gleicht dann die Strings aus den Zeilen spaltenweise ab!? (nur eine Verständnisfrage!!!)

Leider habe ich mein Beispeil etwas zu simpel für mein Problem strukturiert und so bleiben noch ein paar Fragen offen:

1) Wie kann ich den Code anpassen, dass er auch für Kommazahlen funktioniert!? Mein Test war da leider negativ :(

2) Wie kann ich ihn so erweitern, dass er automatisch für beliebige Zeilen, Spaltenanzahl läuft!? ( Wobei auf jeden Fall immer die gleiche Zeilenanzahl in jeder Spalte vorhanden ist und auch keine Leerzeilen; Zellen vorliegen!)

3) Wie kann ich beim Abgleich die ersten beiden Spalten ignorieren, aber beim Zeilenlöschen berücksichtigen, also immer noch ganze zeile löschen (auch in den ersten beiden Zeilen)!?

Hier ein konkretes Beispiel:

01.01.2008 0 1,23 0,5 3
02.01.2008 0 1,25 0,7 3,01
03.01.2008 0 1,02 0,65 3,045
04.01.2008 0 1,45 0,45 2,3
05.01.2008 1 1,63 1,63 1,63
06.01.2008 0 3,5 1,1 1,4
07.01.2008 0 2 1,2 1,55
08.01.2008 0 2,1 1,1 1,4
09.01.2008 0 2,1 1,1 1,4
10.01.2008 1 3 1 1,4
11.01.2008 0 3,1 1,2 1,3
12.01.2008 0 3,2 1,3 1,7
13.01.2008 0 3,2 1,3 1,7
14.01.2008 0 3,4 1,2 1

- Erste Spalte: Fortlaufendes Datum.
- Zweite Spalte: Binärvariable z.B. Indikator für Freitag.

insgesamt 5 Spalten; 14 Zeilen.

Es sollten also Zeile 9 und 13 komplett gelöscht werden, inklusive Datum( erste Spalte) und Indikator (zweite Spalte).


beste grüße und vielen Dank, basti


  

Betrifft: AW: Makro um doppelte Einträge zu suchen und zu filtern
von: Drogist
Geschrieben am: 02.08.2010 21:57:39

Hallo Excelneuling2,

Das Einbinden und ausführen deines Codes hat tadellos funktioniert und das gewünschte Ergebnis erzeugt, einfach toll :)
Danke.
Wenn ich das richtig verstanden habe wandelt dein Code alle Zeilenzeichen in einen String und gleicht dann die Strings aus den Zeilen spaltenweise ab!? (nur eine Verständnisfrage!!!)
Jein. :)
Also, zur Begrifflichkeit: 1, 2, 3, ... das sind die Zeilen (horizontal) und A, B, C, ... das siche die (vertikalen) Spalten.

Ich vergleiche nun zuerst einmal, ob der Wert in Spalte A beispielsweise A10 identisch ist mit der darüber liegenden Zeile gleiche Spalte, hier A9. Wenn die nicht identisch sind, kann der Rest auch nicht identisch sein und A9 wird mit A8 verglichen. Sind die identisch, dann füge ich tatsächlich aus beiden Zeilen alle 3 Spalten einer Zeile zu einem String zusammen und vergleiche die beiden.
1) Wie kann ich den Code anpassen, dass er auch für Kommazahlen funktioniert!? Mein Test war da leider negativ :(
Ich habe die Woche über einfach nicht den "Nerv" groß zu testen. Aber versuche einmal, die _ Zeile 4 des Codes um:
    Dim x1 As single, x2 As single
2) Wie kann ich ihn so erweitern, dass er automatisch für beliebige Zeilen, Spaltenanzahl läuft!? ( Wobei auf jeden Fall immer die gleiche Zeilenanzahl in jeder Spalte vorhanden ist und auch keine Leerzeilen; Zellen vorliegen!)
Hmmm, das sollte eigentlich so schon gehen. Dieser Code

'Größe des zusammenhängenden Bereichs feststellen
Cells(1, 1).Select
LastRow = Selection.End(xlDown).Row
Cells(1, 1).Select
LastCol = Selection.End(xlToRight).Column
beginnt in A1 [Cells(1,1)] und sucht von alleine die unterste Zeile des zusammenhängenden Bereichs und auch die äußerst rechte Spalte und legt die Werte in den Variablen LastRow und LastCol fest.
3) Wie kann ich beim Abgleich die ersten beiden Spalten ignorieren, aber beim Zeilenlöschen berücksichtigen, also immer noch ganze zeile löschen (auch in den ersten beiden Zeilen)!?

OK, willst du die komplette Zeile löschen oder nur die Spalten A:E? Danach richtet sich die 5. Zeile von unten. - Prinzipiell musst du
        x1 = Cells(i, 1).Value
        x2 = Cells(i - 1, 1).Value

ändern in
        x1 = Cells(i, 3).Value
        x2 = Cells(i - 1, 3).Value

und das an allen anderen Stellen entsprechend anpassen. Cells(Zeile, Spalte) ist die Syntax. Ungeprüft, versuche einmal diesen Code (komplette Sub):
Sub DelDuplicate3()
    Dim LastRow As Long
    Dim LastCol As Long
    Dim x1 As Single, x2 As Single
    Dim y1 As String, y2 As String
    Dim i As Long, k As Long
    
    'Größe des zusammenhängenden Bereichs feststellen
    Cells(1, 1).Select
    LastRow = Selection.End(xlDown).Row
    Cells(1, 1).Select
    LastCol = Selection.End(xlToRight).Column
    
    For i = LastRow To 2 Step -1
        x1 = Cells(i, 3).Value
        x2 = Cells(i - 1, 3).Value
        If x1 = x2 Then
            y1 = x1
            For k = 4 To LastCol
                y1 = y1 & Cells(i, k)
            Next k
            y2 = x2
            For k = 4 To LastCol
                y2 = y2 & Cells(i - 1, k)
            Next k
            
            If y1 = y2 Then
                'Range(Cells(i, 1), Cells(i, LastCol)).Delete Shift:=xlUp
                Cells(i, 1).EntireRow.Delete    'Ganze Zeile löschen
            End If
        End If
    Next i
End Sub
Es sollten also Zeile 9 und 13 komplett gelöscht werden, inklusive Datum( erste Spalte) und Indikator (zweite Spalte).

Das sollte dann auch hinhauen ...

LG
Drogist


  

Betrifft: AW: Makro um doppelte Einträge zu suchen und zu filtern
von: Excelneuling2
Geschrieben am: 07.08.2010 14:29:13

Hallo Drogist,

das hat perfekt funktioniert.

Das Makro ist damit z.B. in der Lage aus Spaltenweisen notierten Aktienkursen die Feiertage herauszufiltern, da diese normaler weise die gleiche Eintragung des Vortages für den Feiertag doppeln (dort wird ja nicht gehandelt).

Vllt. braucht das ja mal wieder jemand :)

Vielen Dank für deinen Einsatz beim Lösen meines Problems und für deine Erläuterungen der VBA Syntax, dass hilft auf die Beine,

basti

P.S.: Ich nutze dieses Makro nicht gewerblich oder verdiene damit Geld, wenn dem so wäre hätte ich mich an die Auftragsprogrammierung gewandt!!! (Nur um irgendwelchen komischen posts zuvor zukommen ;))


  

Betrifft: AW: Makro um doppelte Einträge zu suchen und zu filtern
von: Excelneuling2
Geschrieben am: 01.08.2010 15:25:20

der übersicht halber nochmal mit trennzeichen:

01.01.2008 | 0 | 1,23 | 0,5 |3
02.01.2008 | 0 | 1,25 | 0,7 |3,01
03.01.2008 | 0 | 1,02 | 0,65| 3,045
04.01.2008 | 0 | 1,45 | 0,45| 2,3
05.01.2008 | 1 | 1,63 | 1,63| 1,63
06.01.2008 | 0 | 3,5 | 1,1 |1,4
07.01.2008 | 0 | 2 |1,2 |1,55
08.01.2008 | 0 | 2,1 | 1,1 |1,4
09.01.2008 | 0 | 2,1 | 1,1 |1,4
10.01.2008 | 1 | 3 | 1 |1,4
11.01.2008 | 0 | 3,1 | 1,2 |1,3
12.01.2008 | 0 | 3,2 | 1,3 |1,7
13.01.2008 | 0 | 3,2 | 1,3 |1,7
14.01.2008 | 0 | 3,4 | 1,2 |1