Autor: Uwe Küstner --- Aus Excel VBA - Gruppe:
VerschiedenesDuplikate löschen spezial
Autor: Uwe Küstner - Erstellt: 2006-04 - Letzte Revision: --
Duplikate löschen an gleicher Stelle
- Suchspalten sind frei wählbar
- Formeln bleiben erhalten
Zum Entfernen von Duplikaten ist normalerweise der
Spezialfilter die erste Wahl, da er formelfrei und schnell arbeitet.
Aber:
- er vergleicht alle Spalten des Listenbereichs auf Duplikate. Und nur, wenn alle Spalten übereinstimmen, werden die Dublettenzeilen gelöscht
- die Liste muss eine Überschriftenzeile haben
- es funktioniert nur, wenn an eine andere Stelle kopiert wird
- und falls die Tabelle Formeln enthält, sind sie im Anschluss gelöscht
Mit nachstehendem Code gebe ich Ihnen ein Medium,
- mit dem Sie alle oder ausgewählte Spalten auf Dubletten untersuchen können
- mit dem an gleicher Stelle die Daten auf das Gewünschte reduziert werden
- bei dem es egal ist, ob die Liste eine Überschriftenzeile hat
- mit dem die Formeln erhalten bleiben
- das mindestens doppelt so schnell ist wie der Spezialfilter
Zur Handhabung des Codes:
- Um nach Dubletten in einer Spalte zu suchen, setzen sie den Cursor vor Makroaufruf in diese Spalte
- Um nach Dubletten in Bezug auf mehrere Spalten zu suchen, markieren Sie diese vor Makroaufruf mit gedrückter Strg-Taste
- Um nach Dubletten in Bezug auf alle Spalten zu suchen, markieren Sie diese vor Makroaufruf, indem sie alle Spalten des Bereichs markieren
- Es wird rückgefragt, ab welcher Zeile das Makro arbeiten soll, voreingestellt ist Zeile 2, da angenommen wird, dass in Zeile 1 die Überschrift liegt; aber das können Sie grundsätzlich im Code ändern oder bei Makroablauf aktuell über Inputboxeingabe ändern
- Vor dem endgültigen Löschen erfolgt eine Mitteilung, wieviel Duplikate gefunden wurden mit der Rückfrage, ob wirklich gelöscht werden soll
- Wenn Sie bei dieser Rückfrage auf Nein klicken, bricht der Code ab, aber die Dubletten der durchsuchten Spalten bleiben markiert. Sie könnten die Dubletten nun auf Wunsch (vorher nicht woanders hinklicken!!!) umformatieren, wenn Sie diese durch Formatierung kennzeichnen wollen.
Sub DoppelteEintraegeLoeschen()
'Uwe Küstner, 20060514
Dim colUnique As New Collection
Dim lngAbZeile As Long
Dim lngArr As Long
Dim lngC As Long
Dim lngCalc As Long
Dim lngDup As Long
Dim lngMaxArrays As Long
Dim lngZ As Long
Dim lngZeile As Long
Dim lngZeilenArray As Long
Dim lngZeilenBereich As Long
Dim rngArea As Range
Dim rngAuswahl As Range
Dim rngC As Range
Dim rngDel() As Range
Dim rngSel As Range
Dim strSuchbereich As String
Dim strZeile As String
Dim varAuswahl() As Variant
Dim varC As Variant
Set rngSel = Selection.EntireColumn
lngZeilenBereich = ActiveSheet.UsedRange.Rows.Count
On Error GoTo FehlerBehandlung
lngCalc = Application.Calculation
Set rngAuswahl = _
Application.Intersect(Selection.EntireColumn, ActiveSheet.UsedRange)
strSuchbereich = rngAuswahl.Address(0, 0)
lngAbZeile = Abs(CLng(Application.InputBox( _
vbLf & "Ab welcher Zeile soll geprüft werden?", _
"Prüfbereich festlegen", 2, , , , , 1)))
If lngAbZeile > 0 And lngAbZeile <= lngZeilenBereich Then
Set rngAuswahl = _
Application.Intersect(Rows(lngAbZeile & ":" & lngZeilenBereich), rngSel)
Else
MsgBox "Die Zeile " & lngAbZeile & _
" liegt außerhalb des Bereichs """ & strSuchbereich & """!"
Exit Sub
End If
lngZeilenArray = lngZeilenBereich - lngAbZeile + 1
rngAuswahl.Select
lngArr = 1
ReDim rngDel(lngArr)
lngMaxArrays = lngZeilenBereich / 50
strSuchbereich = rngAuswahl.Address(0, 0)
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
For Each rngArea In rngAuswahl.Areas
For Each rngC In rngArea.Columns
lngC = lngC + 1
ReDim Preserve varAuswahl(1 To lngC)
varAuswahl(lngC) = rngC.Value
Next rngC
Next rngArea
colUnique.Add 0, "" 'wenn 1. Leerzeile auch berücksichtigt werden soll
For lngZeile = 1 To lngZeilenArray
strZeile = ""
For lngZ = 1 To lngC
strZeile = strZeile & CStr(varAuswahl(lngZ)(lngZeile, 1))
Next lngZ
colUnique.Add lngZeile, strZeile
Next lngZeile
Set rngDel(0) = rngDel(1)
lngArr = lngArr + (rngDel(lngArr) Is Nothing)
If lngArr > 1 Then
For lngZ = 2 To lngArr
Set rngDel(0) = Application.Union(rngDel(0), rngDel(lngZ))
Next lngZ
End If
lngDup = rngDel(0).Cells.Count / 256
Application.Intersect(rngSel, rngDel(0)).Select
Application.ScreenUpdating = True
If MsgBox("Es wurden " & lngDup & " Duplikate im Bereich" & vbLf & _
strSuchbereich & vbLf & _
"gefunden." & vbLf & vbLf & "Sollen sie jetzt gelöscht werden?", _
vbQuestion Or vbYesNo Or vbDefaultButton2) = vbYes Then
Application.ScreenUpdating = False
For lngZ = lngArr To 1 Step -1
rngDel(lngZ).Delete
Next lngZ
rngSel.Select
Application.ScreenUpdating = True
End If
FehlerBehandlung:
Select Case Err.Number
Case 457
If rngDel(lngArr) Is Nothing Then
Set rngDel(lngArr) = Rows(lngZeile + lngAbZeile - 1)
Else
Set rngDel(lngArr) = _
Application.Union(rngDel(lngArr), Rows(lngZeile + lngAbZeile - 1))
End If
If rngDel(lngArr).Areas.Count = lngMaxArrays Then
lngArr = lngArr + 1
ReDim Preserve rngDel(lngArr)
End If
Resume Next
Case 13, 91
MsgBox "Im Bereich" & vbLf & vbLf & """" & _
strSuchbereich & """" & vbLf & vbLf & "gibt es keine Duplikate."
Case Is > 0
MsgBox "Fehlernummer: " & Err.Number & vbLf & vbLf & _
"Felerbeschreibung: " & Err.Description
'für Entwicklung zum Testen
' Application.Calculation = lngCalc
' On Error GoTo 0
' Resume
End Select
Application.Calculation = lngCalc
End Sub
Weitere Artikel der Gruppe: Verschiedenes Aus Excel VBA
Nach oben