En bref —
Range.RemoveDuplicates, c'est le bouton Données > Supprimer les doublons en une ligne de code. Deux choses le rendent dangereux là où une boucle ne l'est pas. D'abord, il est destructeur : il supprime les lignes sur place, conserve la première occurrence de chaque doublon, et ne peut pas être annulé une fois la macro exécutée. Ensuite, son argumentColumnsprend des décalages à l'intérieur de la plage, pas des numéros de colonne de la feuille —Columns:=Array(1, 2)désigne la première et la deuxième colonne de la plage, donc si votre plage commence en colonne C, ce sont C et D, pas A et B. Passez toujoursHeader:=xlYes, sauf si votre plage n'a vraiment pas d'en-tête, et sauvegardez les données avant de l'exécuter.
' Supprimer les lignes qui repetent le meme Email (colonne 3 de cette plage). Garde la premiere de chaque.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Contacts")
ws.Range("A1").CurrentRegion.RemoveDuplicates _
Columns:=3, _ ' 3e colonne DE LA PLAGE, en comptant depuis A1
Header:=xlYes ' la premiere ligne est l'en-tete, ne pas la traiter comme des donnees
Dédupliquer une liste est l'un des travaux de nettoyage les plus courants qui soient, et Excel
possède déjà un moteur pour cela — inutile de boucler, comparer et supprimer à la main. Mais
RemoveDuplicates cache deux arêtes vives derrière sa commodité : il détruit les données sans
filet, et son argument clé ne signifie pas ce que la plupart des gens croient. Ce guide s'articule
autour de ces deux faits.
Ce que vous allez apprendre
- Le modèle mental — c'est le bouton Supprimer les doublons, et il supprime sur place
- La règle la plus importante — les numéros de
Columnssont des décalages dans la plage, pas des colonnes de la feuille - Pourquoi
Header:=xlYesest presque toujours obligatoire - Le fait qu'il garde la première ligne, pas la dernière — et qu'il n'y a pas d'annulation
- Une colonne ou plusieurs : ce qui compte réellement comme « doublon »
- Quand utiliser
RemoveDuplicates,AdvancedFilter, ou plutôt unDictionary
Le modèle mental : c'est le bouton, et il supprime
Range.RemoveDuplicates fait exactement ce que fait Données > Supprimer les doublons dans le
ruban : il balaie la plage, et pour chaque ligne dont les colonnes clés répètent une ligne
précédente, il supprime cette ligne. Les lignes en dessous remontent pour combler le vide,
comme pour n'importe quelle suppression de ligne.
Deux conséquences en découlent aussitôt, et les deux prennent au piège. Il modifie vos données sur
place — il n'existe pas de mode « copier les valeurs uniques ailleurs » ; les lignes d'origine ont
disparu. Et une fois la macro exécutée, la pile d'annulation d'Excel est vide, si bien que ni
vous ni l'utilisateur ne pouvez appuyer sur Ctrl+Z pour les récupérer. Traitez
RemoveDuplicates comme vous traiteriez un Delete : quelque chose que vous n'exécutez que sur des
données que vous avez sauvegardées, ou sur une copie faite exprès.
La règle la plus importante : Columns sont des décalages de plage, pas des colonnes de la feuille
C'est le bug qui fait que RemoveDuplicates « supprime les mauvaises lignes ». L'argument Columns
compte les colonnes depuis le bord gauche de la plage, à partir de 1 — cela n'a rien à voir avec
les lettres de colonne de la feuille ni leurs numéros absolus.
' La plage commence en colonne C. On veut dedupliquer sur la colonne Email, soit la colonne E de la feuille.
' Email est la TROISIEME colonne de la plage (C=1, D=2, E=3), donc :
ws.Range("C1:F500").RemoveDuplicates Columns:=3, Header:=xlYes ' correct - E
' FAUX - passer le numero de colonne 5 de la feuille pointe au-dela de la plage (ou provoque une erreur) :
ws.Range("C1:F500").RemoveDuplicates Columns:=5, Header:=xlYes ' pas la colonne Email
Si votre plage commence par hasard en colonne A, le décalage égale le numéro de colonne de la
feuille et le bug se cache — c'est précisément pourquoi il surprend la première fois qu'une plage
commence ailleurs. Quand vous dédupliquez sur plus d'une colonne, passez un tableau de décalages
dans la plage : Columns:=Array(1, 3) signifie que les 1re et 3e colonnes de la plage forment
ensemble la clé.
Header:=xlYes — sinon votre en-tête devient une donnée
RemoveDuplicates doit savoir si la première ligne est un en-tête ou de vraies données. L'argument
est Header, et si vous l'omettez, la valeur par défaut (xlNo) traite la ligne 1 comme des
données. Cela a deux effets fâcheux : votre ligne d'en-tête est comparée aux données et — si une
ligne de données correspond par hasard au texte de l'en-tête — elle peut même être supprimée.
ws.Range("A1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
Passez Header:=xlYes chaque fois que votre plage inclut une ligne d'en-tête, c'est-à-dire presque
toujours. Le seul cas où vous utilisez xlNo est un bloc de valeurs véritablement sans en-tête. Se
tromper là-dessus déclenche rarement une erreur ; cela abîme simplement, en silence, le haut de
votre tableau.
Il garde la première, pas la dernière — et il n'y a pas d'annulation
Quand des lignes entrent en collision, RemoveDuplicates conserve toujours la première
occurrence et supprime les suivantes. La plupart du temps, cela convient. Mais si vos lignes sont
dans l'ordre chronologique et que vous voulez l'enregistrement le plus récent par clé, « garder
la première » est l'exact contraire de ce qu'il vous faut.
Il n'existe aucune option pour inverser ce comportement. L'idiome est de trier d'abord, puis
dédupliquer : triez de sorte que la ligne à conserver soit la première pour sa clé, et le
comportement « garder la première » garde désormais la bonne ligne. Vous voulez la dernière entrée
par client ? Triez par date décroissante, puis RemoveDuplicates sur la clé client. (Voir
VBA Sort pour les règles Header:=xlYes et de tri sur l'enregistrement complet
qui empêchent un tri de mélanger vos colonnes.)
Et pour le redire une fois de plus, car c'est l'erreur qui fait mal : il n'y a pas d'annulation
après une macro. Si les lignes supprimées peuvent un jour compter, ne les supprimez pas — extrayez
plutôt les valeurs uniques vers un nouvel emplacement avec AdvancedFilter, ce qui laisse
l'original intact.
Une colonne ou plusieurs : ce qui compte comme un doublon
L'argument Columns définit aussi ce que « doublon » veut dire. Passez une seule colonne et deux
lignes sont des doublons dès que ce champ unique correspond. Passez-en plusieurs et les lignes ne
sont des doublons que lorsque toutes les colonnes nommées correspondent ensemble.
' Doublon = meme Email (cle sur une colonne).
rng.RemoveDuplicates Columns:=3, Header:=xlYes
' Doublon = meme First ET meme Last name ensemble (cle composite).
rng.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
Cela mérite réflexion avant de l'exécuter, car cela décide quelles lignes disparaissent. « La même personne » peut vouloir dire même e-mail, ou même nom, ou même nom et date de naissance — et chaque choix retire un ensemble de lignes différent. Les colonnes que vous nommez sont la définition ; tout le reste de la ligne suit simplement la copie qui survit.
RemoveDuplicates vs AdvancedFilter vs Dictionary
Trois outils dédupliquent, et ils ne sont pas interchangeables :
RemoveDuplicates— le plus rapide à écrire, mute sur place, garde la première, sans annulation. Le bon choix quand vous voulez vraiment réduire les données elles-mêmes et que vous avez une sauvegarde.AdvancedFilter— extrait une copie unique vers un nouvel emplacement et laisse la source intacte. Le bon choix quand il vous faut une liste distincte sans détruire l'original, ou quand vous voulez des valeurs uniques filtrées par critères en même temps.Dictionary— contrôle total dans le code. Le bon choix quand votre clé de déduplication est calculée (insensible à la casse, nettoyée, une combinaison), quand vous devez compter les occurrences au passage, ou quand vous voulez décider ligne par ligne quelle copie garder.
Le jugement mérite d'être dit sans détour : s'il y a la moindre chance que vous vouliez récupérer
les lignes supprimées, n'utilisez pas RemoveDuplicates — son absence d'annulation est la raison
même de l'existence d'AdvancedFilter.
Comment ExcelMaster aide
RemoveDuplicates a l'air d'une ligne anodine et se comporte comme une arme chargée : les décalages
de Columns qui ne sont pas des colonnes de la feuille, l'option Header qui avale en silence
votre ligne d'en-tête, la règle première-pas-dernière qui garde le mauvais enregistrement, et
l'annulation manquante qui rend une erreur définitive. Chacun d'eux supprime des données sans
déclencher d'erreur.
ExcelMaster vous laisse
plutôt décrire le nettoyage. Dites « supprime les contacts en double en gardant le plus récent par
date » ou « déduplique sur l'e-mail mais laisse la feuille d'origine tranquille », et il choisit le
bon outil — un tri avant un RemoveDuplicates quand vous voulez le plus récent, ou un
AdvancedFilter vers une nouvelle plage quand la source doit survivre — et sauvegarde toujours la
feuille avant de supprimer quoi que ce soit. Vous gardez le classeur et le code ; vous vous épargnez
l'exécution où une clé décalée d'une colonne a retiré en silence les mauvaises lignes.
Questions fréquentes
Comment supprimer les doublons en VBA ?
Appelez RemoveDuplicates sur la plage : ws.Range("A1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes. L'argument Columns indique quelles colonnes définissent un doublon
(comme décalages dans la plage), et Header:=xlYes dit à Excel que la première ligne est un
en-tête. Il supprime les lignes correspondantes sur place, en gardant la première de chaque, alors
sauvegardez d'abord vos données.
Pourquoi RemoveDuplicates en VBA supprime-t-il les mauvaises lignes ?
Presque toujours parce que Columns compte depuis le début de la plage, pas depuis la colonne A de
la feuille. Si votre plage commence en colonne C, Columns:=1 est la colonne C, pas A. Passez le
décalage de la colonne clé à l'intérieur de la plage, et utilisez un Array(...) de décalages pour
une clé multi-colonnes.
RemoveDuplicates en VBA garde-t-il le premier ou le dernier doublon ?
Il garde la première occurrence et supprime les suivantes, sans aucune option pour changer cela.
Pour garder la dernière (par exemple l'enregistrement le plus récent), triez les données de sorte
que la ligne voulue soit en tête pour sa clé, puis exécutez RemoveDuplicates.
Puis-je annuler RemoveDuplicates en VBA ?
Non. L'exécuter depuis une macro vide la pile d'annulation d'Excel, si bien que ni Ctrl+Z
ni Application.Undo ne restaureront les lignes supprimées. Sauvegardez d'abord les données, ou
utilisez AdvancedFilter pour copier les lignes uniques vers un nouvel emplacement au lieu de
supprimer sur place.
Comment supprimer les doublons sur plusieurs colonnes en VBA ?
Passez un tableau de décalages de plage à Columns : rng.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes. Les lignes ne sont considérées comme des doublons que lorsque toutes les colonnes
nommées correspondent. Les numéros sont des positions dans la plage, en comptant sa première colonne
comme 1.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 10/08/2026.
Guides associés : VBA Advanced Filter · VBA Dictionary · VBA Sort · VBA Delete Rows · VBA Range
