🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Remove Duplicates in Excel — Duplikate in einer Zeile entfernen (und warum es ohne Rückgängig löscht)

|

VBA Remove Duplicates in Excel — Duplikate in einer Zeile entfernen (und warum es ohne Rückgängig löscht)

Kurz gesagtRange.RemoveDuplicates ist 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 ihr Columns-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 immer Header:=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:=xlYes fast 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, AdvancedFilter oder ein Dictionary nutzen

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