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

VBA Remove Duplicates dans Excel — dédupliquer en une ligne (et pourquoi cela supprime sans annulation possible)

|

VBA Remove Duplicates dans Excel — dédupliquer en une ligne (et pourquoi cela supprime sans annulation possible)

En brefRange.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 argument Columns prend 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 toujours Header:=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 Columns sont des décalages dans la plage, pas des colonnes de la feuille
  • Pourquoi Header:=xlYes est 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 un Dictionary

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