|
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.

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
| | A | B | C | D | | 1 | 1 | 2 | 10 | | | 2 | 2 | 3 | 9 | | | 3 | 3 | 4 | 8 | | | 4 | 4 | 5 | 7 | | | 5 | 5 | 6 | 6 | | | 6 | 6 | 7 | 5 | | | 7 | 6 | 7 | 5 | | | 8 | 7 | 8 | 4 | | | 9 | 8 | 9 | 3 | | | 10 | 9 | 10 | 2 | | | 11 | 10 | 1 | 1 | | | 12 | 10 | 1 | 1 | | | 13 | 11 | 12 | 12 | | | 14 | 12 | 13 | 13 | | | 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
| | A | B | C | | 1 | 1 | 2 | 10 | | 2 | 2 | 3 | 9 | | 3 | 3 | 4 | 8 | | 4 | 4 | 5 | 7 | | 5 | 5 | 6 | 6 | | 6 | 6 | 7 | 5 | | 7 | 7 | 8 | 4 | | 8 | 8 | 9 | 3 | | 9 | 9 | 10 | 2 | | 10 | 10 | 1 | 1 | | 11 | 11 | 12 | 12 | | 12 | 12 | 13 | 13 |
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 single2) 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 SubEs 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
|