Cet article est paru, initialement, sur le blog cooking-excel : voir l’article original 

Si vous vous demandez comment supprimer les doublons d'une liste en ne conservant que la ligne la plus récente ? Je vais vous montrer comment faire en partant d'un exemple simple. Tout d'abord dans EXCEL et ensuite dans POWERQUERY.

Supprimons les doublons dans Excel !

Voici le tableau exemple:

L’idée est de supprimer les codes produit en doublon afin de ne garder qu’un libellé produit, celui qui a été mis à jour le plus récemment. Pour P4, nous préférons donc garder “Enceinte” plutôt que “Haut-Parleur” car la date est plus récente.

Le résultat final devrait donc ressembler à ceci:

Dans Excel, cette manipulation est assez simple et en deux clics nous pouvons avoir un résultat probant :

RUBAN : Données > Trier et filtrer > Trier > Choisir Date, Valeurs, Du plus récent au plus ancien > OK

RUBAN : Données > Outils de données > Supprimer les doublons > Sélectionner uniquement Code Produit > OK

Et voila, ce n’est pas plus compliqué !

Et maintenant dans PowerQuery !

Mais dans PowerQuery, les choses se compliquent car la suppression de doublons ne s’applique qu’à la source et non à la table triée comme nous allons le voir.

Première étape : importer le tableau dans Power Query

Se positionner sur n’importe qu’elle cellule du tableau :

Avec Excel 2016 : Données > Récupérer et Transformer > À partir d'un tableau

Avec Excel 2010/2013: Power Query > Données Excel > À partir du tableau

Deuxième étape : trier

L’étape suivante est donc de faire comme dans Excel, à savoir trier le tableau du plus récent au plus ancien :

Clic-droit sur colonne Date > Tri décroissant

Supprimer les doublons

Si nous reprenons ce que nous avons fait dans Excel, nous devons donc supprimer les doublons :

Sélectionnez la colonne Code Produits

Accueil > Réduire les lignes > Supprimer les doublons

Malgré le tri, nous n’avons pas supprimer les bonnes lignes :

En effet, les lignes ont été supprimées en se basant sur la table de départ (Source) et en ne gardant que la première occurrence du Code Produit.

Utilisation du Buffer

Nous allons devoir modifier le code réalisé en langage M :

Accueil > Requête > Editeur avancé

Vous devriez lire le code suivant :

let
    Source = Excel.CurrentWorkbook(){[Name="T_Pdts"]}[Content],
    #"Type modifié" = Table.TransformColumnTypes(Source,{{"Date", type datetime}, {"Code Produit", type text}, {"Libelle", type text}}),
    TriDate = Table.Sort(#"Type modifié",{{"Date", Order.Descending}}),
    #"Doublons supprimés" = Table.Distinct(TriDate, {"Code Produit"})
in
    #"Doublons supprimés"

Nous allons à présent modifier ce code :

let
    Source = Excel.CurrentWorkbook(){[Name="T_Pdts"]}[Content],
    #"Type modifié" = Table.TransformColumnTypes(Source,{{"Date", type datetime}, {"Code Produit", type text}, {"Libelle", type text}}),
    TriDate = Table.Sort(#"Type modifié",{{"Date", Order.Descending}}),
    Buffered = Table.Buffer(TriDate),
    #"Doublons supprimés"= Table.Distinct(Buffered, {"Code Produit"})
in
    #"Doublons supprimés"

Nous avons inséré une ligne et avons modifié la suivante pour que l’enchaînement séquentiel perdure.

La ligne ajoutée est : Buffered = Table.Buffer(TriDate),

En fait, nous avons mis en mémoire vive (Buffer) la table résultante de l’étape précédente, à savoir TriDate. Et nous avons ensuite supprimé les doublons de cette nouvelle table.

De cette façon, la suppression de doublons ne se fait pas depuis la source de la requête mais depuis une autre table enregistrée en mémoire vive.

Cliquez sur OK et observez le résultat.

Pour une meilleure lisibilité, changez le nom de la dernière étape: SupprDoublons

Et vous aurez :

Et pour finir :

Accueil > Fermer et charger

Conclusion

Vous imaginez bien que j’ai testé pas mal d’autres choses, comme utiliser la requête triée en référence d’une autre requête mais le problème n’était pas réglé.

La fonction BUFFER est donc très utile ici mais attention, elle a essentiellement deux inconvénient :

  • Elle brise le Query Folder
  • Si le nombre d’éléments de la requête est conséquent, cela peut poser de lourds problèmes de performances.

Dans mon cas, j’ai eu besoin d’utiliser cette fonction avec Power Query pour Importer des fichiers d’incidents que des collègues m’avaient extraits. Toutefois, il y avait des doublons entre les différents fichiers envoyés. J’ai donc dû les supprimer. Les statuts des incidents ont évolué et je ne voulais que le dernier statut, d’où ce besoin. J’ai traité quelques milliers de lignes sans aucun problème avec cette fonction BUFFER.