XL 2013 Remove duplicates : pourquoi tel doublon plutôt que tel autre conservé ?

Sebast

XLDnaute Impliqué
Bonjour à toutes et à tous,


ma question concerne la suppression de doublons.

Je voudrais savoir quelle règle suit excel quand, face à deux (ou n) éléments identiques, il n'en laisse qu'un.

en clair, si deux éléments identiques sont par exemple respectivement sur la ligne 3 et 25, pourquoi xl supprime-t-il la ligne 25 plutôt que 3 ?


Dans mon cas précis, ça n'est pas sans importance (ici cas fictif, réduit à sa plus simple expression et avec des valeurs parlantes; la réalité est beaucoup plus complexe ... )


Feuille Table contient une nomenclature de produits et la famille respective (ex : Kiwi rattaché à la famille Fruit, betterave à la famille Légume)

Feuille Base contient un historique des ventes et présente donc pour les différents produits les volumes et lieux de livraison

A partir de Base, je recueille les produits nouveaux et les affecte à leur famille de rattachement (ex : le produit cerise apparaît en feuille Base et donc il m'appartient de mettre à jour Table : cerise = Fruit)


Avec mon code j'actualise la feuille Table : j'ajoute à Table les produits nouveaux issus de Base

Pour cela, je copie Base dans Table puis supprime les doublons et ne sélectionne que la colonne Produits (sinon, avec 2 colonnes sélectionnées, xl ne voit pas - à juste titre - de redondance)

Mais je veux impérativement conserver dans Table l'information concernant la famille. Ainsi, avec remove duplicates, je veux par exemple pour Abricot (en Base mais déjà présent en Table) que excel conserve

la ligne Abricot Fruit et non Abricot (tout court ou Abricot 27 comme en Base).


Pour l'heure, le code semble faire ça mais je ne sais pas pourquoi. Je ne voudrais pas employer un code qui ultérieurement me fera faire des erreurs, que je risque de ne pas voir quand j'utiliserai les vraies données (volume important et peu parlantes, donc erreurs peu détectables)


Quelqu'un sait-il si avec mon code, quand je tombe sur

Produit Famille

Abricot Fruit

et

Abricot (vide)


ce sera bien toujours la ligne Abricot Fruit qui sera conservé ?


Sub Purge()


Dim lastBase As Long

Dim lastTable As Long

Dim lastActu As Long


lastBase = Sheets("Base").Range("B" & Rows.Count).End(xlUp).Row

lastTable = Sheets("Table").Range("B" & Rows.Count).End(xlUp).Row


' on copie les données de la feuille 'Base' vers la feuille 'Table'

Sheets("Base").Range("B2:B" & lastBase).Copy Destination:=Sheets("Table").Range("A" & lastTable + 1)


' les données étant ajoutées, on supprime les doublons

lastActu = Sheets("Table").Range("A" & Rows.Count).End(xlUp).Row 'on sonde à nouveau la dernière ligne car on y a ajouté des données

Sheets("Table").Range("A1:A" & lastActu).RemoveDuplicates Columns:=1, Header:=xlYes


End Sub



Merci d'avance pour vos lumières

PS : veuillez excuser la mise en forme, tout à coup sur un autre ordi, je ne retrouve plus les balises et autres mises en forme ...
 

Pièces jointes

  • Remove_duplicates.xlsm
    24.6 KB · Affichages: 41

Modeste

XLDnaute Barbatruc
Bonjour Sebast,

Pas certain d'avoir bien compris ... Mais plutôt que d'essayer de trouver une réponse à ta question, pourquoi ne pas te contenter d'ajouter les produits qui ne sont pas encore présents dans ta feuille Table?

Je vais aller profiter de ce rayon de soleil ... pour te laisser de quoi t'occuper pendant ce temps, une proposition en pièce jointe: à chaque ajout d'un produit en colonne B de Base, on vérifie si le produit en question existe. Si pas un message demande s'il faut l'ajouter ... Tu verras bien si ça convient!
 

Pièces jointes

  • Remove_duplicates ou pas (Sebast).xlsm
    27.3 KB · Affichages: 41
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Bonjour Sebast, Modeste.

Je ne sais pas comment fonctionne exactement la suppression de doublons. En attendant, comme Modeste, j'y vais de mon petit bricolage...​

Bonne soirée.

ℝOGER2327
#8339


Mardi 17 Absolu 144 (Céphalorgie - Vacuation)
3 Vendémiaire An CCXXV, 5,9668h - châtaigne
2016-W38-6T14:19:13Z
 

Pièces jointes

  • Copie de Remove_duplicates.xlsm
    27.6 KB · Affichages: 53

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

Après recherche sur Gogol (dans la langue des Grand-Bretons), j'ai trouvé un propos de Rick Rothstein (MVP - Excel) qui est une pointure parmi les référents Excel. Il y décrit le comportement de Remove Duplicates. C'est la première occurence rencontrée qui est conservée, les autres étant éliminées.

L'article:
Rick Rothstein (MVP - Excel)
July 31, 2010 at 1:31 pm · Reply
@hans,

(...). When you remove duplicates, you delete the 2nd, 3rd, etc. occurrence of the item leaving the first one in the list. So, Pen appears three times in the list... the first Pen is kept and the 2nd and 3rd ones (the duplicates) are removed. (...)

-> Lien vers la page de l'article
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir à tous

mapomme (salut;))
C'est la première occurrence rencontrée qui est conservée, les autres étant éliminée.
Un doublon c'est forcément à partir de la deuxième occurrence, sinon c'est un singleton ;)
Ce qui est somme toute simplement logique, non ?
(Ceci dit moi j'aime Rick d'abord pour ceci
Before buying my first IBM compatible PC, I owned a Commodore 128 and Atari 520

(source)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir Staple1600 ;),

(...) Un doublon c'est forcément à partir de la deuxième occurrence, sinon c'est un singleton ;)
Ce qui est somme toute simplement logique, non ?
(Ceci dit moi j'aime Rick d'abord pour ceci
Before buying my first IBM compatible PC, I owned a Commodore 128 and Atari 520 (...)

OK pour le singleton. Mais la question était de savoir quelle occurence était conservée par RemoveDuplicates. Pour le singleton pas de PB, le dernier sera le premier et vice-versa, mais pour les doublons (voire plus : triplets, quadruplets, ...), quelle occurence garde-t-on ? Tout ceci, bien sûr, n'a de sens que si on travaille sur plus d'une colonne et en n'incluant pas tous les champs dans les critères de doublons.

Bah! Et mon Amstrad CPC 464 avec ses grosses touches rouges et vertes! Personne n'en parle ? Juste après, ce fut un Goupil G4 (with the first Windows!).
 

Sebast

XLDnaute Impliqué
Bonjour à tous et merci pour vos propositions,

désolé pour ma réponse tardive : ce weekend , je n'avais pas accès à l'ordi sur lequel il y a mon fichier.

J'ai bien conscience qu'on peut contourner le problème en testant la présence d'un nouvel élément dans la feuille.

Cependant, je voulais simplifier la chose en copiant/collant puis en supprimant les doublons


Modeste

j'avoue que ma présentation est un peu longuette et peut-être confuse …

Tu as bien fait de profiter du soleil, chez nous aussi c'est désormais de l'histoire ancienne !

Effectivement, ta solution fait le job mais ne traite pas en masse (c'est au moment de saisir qu'on le voit); or, c'est par dowload que j'alimente la feuille Base.


Roger

Le code est efficace mais pour moi un peu obscur (je ne suis pas trop familier des dictionnaires, mais reconnait leur efficacité)

Par contre vous précisez : "Ajouter la référence à la bibliothèque Microsoft Scripting Runtime (scrrun.dll) au projet !"

Chez moi, je n'ai rien fait et pourtant ça fonctionne. Est-ce dû à ma version 2013 (qui aurait cet objet par défaut) ?


mapomme

Je suis content de voir que je ne suis pas le seul à m'être posé la question … même si ça paraît évident (comme le montre la remarque de JM).

J'avais élargi ma recherche comme toi à des sites étrangers (on y arrive vite en tapant le code anglais …) mais je n'avais pas trouvé la contribution de notre ami MVP.


JM

Bien sûr qu'un doublon c'est à partir de 2 éléments mais si le même élément est sur la ligne 3 et le suivant sur la ligne 37, quelle règle suit excel pour flinguer ce doublon ?

Ligne 3 ou ligne 37 ?

La contribution de Rick Rothstein via mapomme y répond.

Encore merci à tous
 

ROGER2327

XLDnaute Barbatruc
Re...

Bonjour à tous et merci pour vos propositions,

(...)

Roger

Le code est efficace mais pour moi un peu obscur (je ne suis pas trop familier des dictionnaires, mais reconnait leur efficacité)

Par contre vous précisez : "Ajouter la référence à la bibliothèque Microsoft Scripting Runtime (scrrun.dll) au projet !"

Chez moi, je n'ai rien fait et pourtant ça fonctionne. Est-ce dû à ma version 2013 (qui aurait cet objet par défaut) ?

(...)
Vous trouverez en pièce jointe un commentaire assez fourni du code. S'il y manque des choses, j'essaierai de compléter selon vos éventuelles questions.​

Bonne soirée.

Modification : la pièce jointe, complétée, est déplacée vers le message #10.

ℝOGER2327
#8340


Jeudi 19 Absolu 144 (Sainte Grues, ophiophiles - fête Suprême Quarte)
5 Vendémiaire An CCXXV, 7,2862h - cheval
2016-W39-1T17:29:13Z
 
Dernière édition:

Sebast

XLDnaute Impliqué
Bonjour,


Merci beaucoup pour ces explications très complètes et didactiques.

Avec ces remarques, c’est tout de suite beaucoup plus parlant.


Cependant quelques précisions :



[ligne 16] liste(v(i, 1)) = Empty

Je ne comprends pas cette instruction et ne vois pas de commentaire à ce sujet
Je comprends qu'on rend vide le tableau ...




[ligne 23] If j Then .Range("A1").Offset(k).Resize(j, 1).Value = v

Je ne comprends pas l’instruction If j Then

Ne devrait-on pas écrire if j<n ou if j>0 etc. ?

C’est-à-dire comparer j à une valeur donnée ?



Pour le reste, il me faut l’assimiler


Un grand merci pour avoir pris le temps et la patience de décortiquer le code


Bonne journée
 

ROGER2327

XLDnaute Barbatruc
Re...

J'ai complété les commentaires : voyez la pièce jointe.

Bonne soirée.

ℝOGER2327
#8342


Vendredi 20 Absolu 144 (Sainte Mélusine, souillarde de cuisine - fête Suprême Quarte)
6 Vendémiaire An CCXXV, 6,9084h - balsamine
2016-W39-2T16:34:48Z
 

Pièces jointes

  • Procédure commentée 3bis corrigé.pdf
    117.7 KB · Affichages: 66
Dernière édition:

Sebast

XLDnaute Impliqué
Bonjour Roger 2327,


merci pour cette fiche technique ciblée et détaillée.


Remarque concernant la ligne 16

Effectivement, sans vos explications, je n’y serais jamais arrivé … Ca n’est pas intuitif mais avec la démarche très détaillée, ça s’éclaircit un peu !


Remarque concernant la ligne 23

Je subodorais que l’absence de valeur pour le test devait renvoyer à du booléen mais n’en voyais pas les limites, comme exposé avec un nombre pas entier.


Encore merci pour ces éclaircissements très complets.

Auriez-vous un tuto à recommander (lien ?) pour un grand débutant en matière de dictionnaire ? Surtout avec exemples multiples et variés.



En aparté

Pour en revenir à ma demande initiale, à savoir comment se comporte remove duplicates, un simple exemple comme suit montre ce qui se passe :


Colonne A

1

2

3

4

1

2

7

8

23




En appliquant remove duplicates sur la colonne, il reste


Colonne A

1

2

3

4

7

8

23



Ce qui montre bien que – comme on peut s’y attendre – le ménage est fait depuis la fin de la table (en vertu probablement du principe step – 1 …).

Mais tout cela n’a rien de scientifique, je ne fais que constater, ce qui sur le cas d’espèce fonctionne …

Bonne soirée
 

Discussions similaires

Statistiques des forums

Discussions
311 721
Messages
2 081 928
Membres
101 842
dernier inscrit
seb0390