Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1168to1172
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
Inhaltsverzeichnis

Makro um doppelte Einträge zu suchen und zu filtern

Makro um doppelte Einträge zu suchen und zu filtern
Excelneuling2
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
AW: Crosspost
31.07.2010 16:48:11
Hajo_Zi
Hallo Jürgen,
da wird er ja bald geschlossen, falls Du da auch drauf hingewiesen hast.
Gruß Hajo
AW: Makro um doppelte Einträge zu suchen und zu filtern
31.07.2010 16:46:16
Hajo_Zi
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.

Anzeige
AW: Makro um doppelte Einträge zu suchen und zu filtern
31.07.2010 23:27:49
ransi
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
Anzeige
AW: Makro um doppelte Einträge zu suchen und zu filtern
01.08.2010 12:54:54
Drogist
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
Anzeige
AW: Makro um doppelte Einträge zu suchen und zu filtern
01.08.2010 15:19:12
Excelneuling2
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
Anzeige
AW: Makro um doppelte Einträge zu suchen und zu filtern
02.08.2010 21:57:39
Drogist
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
Anzeige
AW: Makro um doppelte Einträge zu suchen und zu filtern
07.08.2010 14:29:13
Excelneuling2
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 ;))
Anzeige
AW: Makro um doppelte Einträge zu suchen und zu filtern
01.08.2010 15:25:20
Excelneuling2
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

309 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige