Kurz gesagt —
Range.RemoveDuplicatesist die Schaltfläche Daten > Duplikate entfernen als eine Codezeile. Zwei Dinge machen sie gefährlich auf eine Art, wie es eine Schleife nicht ist. Erstens ist sie zerstörerisch: Sie löscht Zeilen an Ort und Stelle, behält das erste Vorkommen jedes Duplikats und lässt sich nicht rückgängig machen, sobald ein Makro gelaufen ist. Zweitens nimmt ihrColumns-Argument Versätze innerhalb des Bereichs, nicht die Spaltennummern des Blatts —Columns:=Array(1, 2)meint die erste und zweite Spalte des Bereichs, beginnt Ihr Bereich also in Spalte C, sind das C und D, nicht A und B. Übergeben Sie immerHeader:=xlYes, es sei denn, Ihr Bereich hat wirklich keine Kopfzeile, und sichern Sie die Daten, bevor Sie es ausführen.
' Zeilen entfernen, die dieselbe Email wiederholen (Spalte 3 dieses Bereichs). Behaelt jeweils die erste.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Contacts")
ws.Range("A1").CurrentRegion.RemoveDuplicates _
Columns:=3, _ ' 3. Spalte DES BEREICHS, gezaehlt ab A1
Header:=xlYes ' die erste Zeile sind Kopfzeilen, nicht als Daten behandeln
Eine Liste zu entdoppeln ist eine der häufigsten Aufräumaufgaben überhaupt, und Excel hat bereits
eine Engine dafür — Sie müssen nicht von Hand schleifen, vergleichen und löschen. Doch
RemoveDuplicates verbirgt hinter seiner Bequemlichkeit zwei scharfe Kanten: Es zerstört Daten
ohne Sicherheitsnetz, und sein Schlüsselargument bedeutet nicht das, was die meisten annehmen. Diese
Anleitung ist um diese zwei Tatsachen herum gebaut.
Was Sie lernen
- Das mentale Modell — es ist die Schaltfläche Duplikate entfernen, und es löscht an Ort und Stelle
- Die wichtigste Regel — die
Columns-Zahlen sind Bereichsversätze, keine Blattspalten - Warum
Header:=xlYesfast immer erforderlich ist - Dass es die erste Zeile behält, nicht die letzte — und es kein Rückgängig gibt
- Eine Spalte oder mehrere: was tatsächlich als „Duplikat“ zählt
- Wann Sie stattdessen
RemoveDuplicates,AdvancedFilteroder einDictionarynutzen
Das mentale Modell: es ist die Schaltfläche, und sie löscht
Range.RemoveDuplicates tut genau das, was Daten > Duplikate entfernen im Menüband tut: Es
durchsucht den Bereich, und für jede Zeile, deren Schlüsselspalten eine frühere Zeile wiederholen,
löscht es diese Zeile. Die Zeilen darunter rücken nach oben und füllen die Lücke, genau wie bei
jedem anderen Zeilenlöschen.
Zwei Folgen ergeben sich sofort, und beide erwischen die Leute. Es ändert Ihre Daten an Ort und
Stelle — es gibt keinen Modus „kopiere die eindeutigen woandershin“; die ursprünglichen Zeilen sind
weg. Und nachdem ein Makro gelaufen ist, ist Excels Undo-Stapel leer, sodass weder Sie noch der
Nutzer Ctrl+Z drücken können, um sie zurückzuholen. Behandeln Sie RemoveDuplicates wie
ein Delete: etwas, das Sie nur gegen Daten laufen lassen, die Sie gesichert haben, oder gegen eine
Kopie, die Sie absichtlich gemacht haben.
Die wichtigste Regel: Columns sind Bereichsversätze, keine Blattspalten
Das ist der Bug, der RemoveDuplicates „die falschen Zeilen löschen“ lässt. Das Columns-Argument
zählt die Spalten ab dem linken Rand des Bereichs, beginnend bei 1 — es hat nichts mit den
Spaltenbuchstaben des Blatts oder ihren absoluten Nummern zu tun.
' Bereich beginnt in Spalte C. Wir wollen ueber die Email-Spalte entdoppeln, das ist Blattspalte E.
' Email ist die DRITTE Spalte des Bereichs (C=1, D=2, E=3), also:
ws.Range("C1:F500").RemoveDuplicates Columns:=3, Header:=xlYes ' richtig - E
' FALSCH - die Blattspaltennummer 5 zeigt eins hinter den Bereich hinaus (oder wirft einen Fehler):
ws.Range("C1:F500").RemoveDuplicates Columns:=5, Header:=xlYes ' nicht die Email-Spalte
Beginnt Ihr Bereich zufällig in Spalte A, entspricht der Versatz der Spaltennummer des Blatts und der
Bug versteckt sich — genau deshalb überrascht er die Leute, sobald ein Bereich erstmals irgendwo
anders beginnt. Wenn Sie über mehr als eine Spalte entdoppeln, übergeben Sie ein Array aus
Bereichsversätzen: Columns:=Array(1, 3) meint, dass die 1. und die 3. Spalte des Bereichs
zusammen den Schlüssel bilden.
Header:=xlYes — sonst wird Ihre Kopfzeile zu Daten
RemoveDuplicates muss wissen, ob die erste Zeile eine Kopfzeile oder echte Daten ist. Das Argument
heißt Header, und lassen Sie es weg, behandelt der Standardwert (xlNo) Zeile 1 als Daten. Das hat
zwei fiese Folgen: Ihre Kopfzeile wird gegen die Daten verglichen, und — falls eine Datenzeile
zufällig zum Kopfzeilentext passt — kann sie sogar gelöscht werden.
ws.Range("A1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
Übergeben Sie Header:=xlYes, wann immer Ihr Bereich eine Kopfzeile einschließt, was fast immer der
Fall ist. Der einzige Zeitpunkt, zu dem Sie xlNo nehmen, ist ein wirklich kopfzeilenloser Block aus
Werten. Das falsch zu machen wirft selten einen Fehler; es zerstückelt einfach klammheimlich den Kopf
Ihrer Tabelle.
Es behält die erste, nicht die letzte — und es gibt kein Rückgängig
Wenn Zeilen kollidieren, behält RemoveDuplicates immer das erste Vorkommen und löscht die
späteren. Meistens ist das in Ordnung. Doch wenn Ihre Zeilen in chronologischer Reihenfolge stehen
und Sie den jüngsten Datensatz je Schlüssel wollen, ist „die erste behalten“ das Gegenteil von
dem, was Sie brauchen.
Es gibt keine Option, das umzudrehen. Das Idiom lautet erst sortieren, dann entdoppeln: sortieren
Sie so, dass die Zeile, die überleben soll, für ihren Schlüssel ganz oben steht, dann behält das
Verhalten „die erste behalten“ nun die richtige Zeile. Sie wollen den jüngsten Eintrag je Kunde?
Sortieren Sie nach Datum absteigend, dann RemoveDuplicates über den Kundenschlüssel. (Siehe
VBA Sort für die Header:=xlYes- und Ganzdatensatz-Regeln, die eine Sortierung
davon abhalten, Ihre Spalten durcheinanderzubringen.)
Und um es noch einmal zu sagen, weil es der Fehler ist, der wehtut: es gibt kein Rückgängig nach
einem Makro. Falls die entfernten Zeilen jemals wichtig sein könnten, löschen Sie sie nicht —
extrahieren Sie die eindeutigen stattdessen mit AdvancedFilter an einen neuen Ort, was das Original
unangetastet lässt.
Eine Spalte oder mehrere: was als Duplikat zählt
Das Columns-Argument definiert außerdem, was „Duplikat“ bedeutet. Übergeben Sie eine Spalte, sind
zwei Zeilen Duplikate, wenn dieses eine Feld übereinstimmt. Übergeben Sie mehrere, sind Zeilen nur
dann Duplikate, wenn alle genannten Spalten zusammen übereinstimmen.
' Duplikat = dieselbe Email (Ein-Spalten-Schluessel).
rng.RemoveDuplicates Columns:=3, Header:=xlYes
' Duplikat = derselbe Vor- UND Nachname zusammen (zusammengesetzter Schluessel).
rng.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
Das ist einen Moment des Nachdenkens wert, bevor Sie es ausführen, denn es entscheidet, welche Zeilen verschwinden. „Dieselbe Person“ kann dieselbe Email meinen, oder denselben Namen, oder denselben Namen und dasselbe Geburtsdatum — und jede Wahl entfernt eine andere Menge an Zeilen. Die Spalten, die Sie nennen, sind die Definition; alles andere in der Zeile kommt einfach mit, welche Kopie auch immer überlebt.
RemoveDuplicates vs AdvancedFilter vs Dictionary
Drei Werkzeuge entdoppeln, und sie sind nicht austauschbar:
RemoveDuplicates— am schnellsten zu schreiben, verändert an Ort und Stelle, behält die erste, kein Rückgängig. Richtig, wenn Sie die Daten selbst wirklich schrumpfen wollen und eine Sicherung haben.AdvancedFilter— extrahiert eine eindeutige Kopie an einen neuen Ort und lässt die Quelle intakt. Richtig, wenn Sie eine eindeutige Liste brauchen, ohne das Original zu zerstören, oder wenn Sie zugleich nach Kriterien gefilterte eindeutige Werte wollen.Dictionary— volle Kontrolle im Code. Richtig, wenn Ihr Entdoppelungsschlüssel berechnet wird (ohne Groß-/Kleinschreibung, getrimmt, eine Kombination), wenn Sie Vorkommen unterwegs zählen müssen, oder wenn Sie je Zeile entscheiden wollen, welche Kopie bleibt.
Die Einschätzung, die man klar aussprechen sollte: Besteht auch nur die Chance, dass Sie die
entfernten Zeilen zurückwollen, nehmen Sie nicht RemoveDuplicates — sein fehlendes Rückgängig ist
der ganze Grund, warum AdvancedFilter existiert.
Wie ExcelMaster hilft
RemoveDuplicates sieht aus wie ein Einzeiler und benimmt sich wie eine geladene Waffe: die
Columns-Versätze, die keine Blattspalten sind, das Header-Flag, das klammheimlich Ihre Kopfzeile
frisst, die Erste-nicht-Letzte-Regel, die den falschen Datensatz behält, und das fehlende Rückgängig,
das aus einem Fehler etwas Dauerhaftes macht. Jedes davon löscht Daten, ohne einen Fehler zu werfen.
ExcelMaster lässt Sie
stattdessen die Bereinigung beschreiben. Sagen Sie „entferne doppelte Kontakte und behalte den nach
Datum jüngsten“ oder „entdopple über die Email, aber lass das ursprüngliche Blatt in Ruhe“, und es
wählt das richtige Werkzeug — ein Sortieren vor einem RemoveDuplicates, wenn Sie den jüngsten
wollen, oder ein AdvancedFilter in einen neuen Bereich, wenn die Quelle überleben muss — und sichert
das Blatt stets, bevor es irgendetwas löscht. Sie behalten die Arbeitsmappe und den Code; Sie sparen
sich den Lauf, in dem ein um eine Spalte verrutschter Schlüssel klammheimlich die falschen Zeilen
entfernt hat.
Häufig gestellte Fragen
Wie entferne ich Duplikate in VBA?
Rufen Sie RemoveDuplicates auf dem Bereich auf: ws.Range("A1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes. Das Columns-Argument benennt, welche Spalten ein Duplikat definieren
(als Versätze innerhalb des Bereichs), und Header:=xlYes sagt Excel, dass die erste Zeile eine
Kopfzeile ist. Es löscht passende Zeilen an Ort und Stelle und behält jeweils die erste, sichern Sie
also zuerst Ihre Daten.
Warum löscht VBA RemoveDuplicates die falschen Zeilen?
Fast immer, weil Columns ab dem Beginn des Bereichs zählt, nicht ab Spalte A des Blatts. Beginnt Ihr
Bereich in Spalte C, ist Columns:=1 die Spalte C, nicht A. Übergeben Sie den Versatz der
Schlüsselspalte innerhalb des Bereichs, und nutzen Sie Array(...) aus Versätzen für einen
Schlüssel über mehrere Spalten.
Behält VBA RemoveDuplicates das erste oder das letzte Duplikat?
Es behält das erste Vorkommen und löscht die späteren, und es gibt keine Option, das zu ändern. Um
das letzte zu behalten (zum Beispiel den jüngsten Datensatz), sortieren Sie die Daten so, dass die
gewünschte Zeile für ihren Schlüssel oben steht, und führen dann RemoveDuplicates aus.
Kann ich RemoveDuplicates in VBA rückgängig machen?
Nein. Es aus einem Makro auszuführen leert Excels Undo-Stapel, sodass weder Ctrl+Z noch
Application.Undo die gelöschten Zeilen wiederherstellt. Sichern Sie die Daten zuerst, oder nutzen Sie
AdvancedFilter, um die eindeutigen Zeilen an einen neuen Ort zu kopieren, statt an Ort und Stelle zu
löschen.
Wie entferne ich in VBA Duplikate über mehrere Spalten?
Übergeben Sie Columns ein Array aus Bereichsversätzen: rng.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes. Zeilen gelten nur dann als Duplikate, wenn alle genannten Spalten übereinstimmen.
Die Zahlen sind Positionen innerhalb des Bereichs, gezählt ab ihrer ersten Spalte als 1.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 10.08.2026.
Verwandte Anleitungen: VBA Advanced Filter · VBA Dictionary · VBA Sort · VBA Zeilen löschen · VBA Range
