Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Renvoyer une liste sans les doublons

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

beabianchini

XLDnaute Occasionnel
Bonjour,

J'ai une liste avec des numéros en doublons.
je souhaiterais que sur une autre feuille une formule me renvoie tous les numéros mais une fois chacun sans doublon.

Merci de votre aide.
Ci-joint le tableau pour une meilleure compréhension?

d'avance merci si quelqu'un peut m'aider.
 

Pièces jointes

Re : Renvoyer une liste sans les doublons

Bonjour à tous.


Merci à Si... qui a groupé quelques propositions.
Je complète son boulot avec un test de durée d'exécution.

Le test porte sur n données engendrées par =ALEA.ENTRE.BORNES(1000000;1500000).


[table="width: 500, class: grid, align: center"]
[tr]
[td]
n​
[/td]
[td]
Onglet K1​
[/td]
[td]
Onglet K2​
[/td]
[td]
Onglet K31​
[/td]
[td]
Onglet K32​
[/td]
[/tr]
[tr]
[td]
10 000​
[/td]
[td]0,08 s[/td]
[td]0,255 s[/td]
[td]0,085 s[/td]
[td]0,125 s[/td]
[/tr]
[tr]
[td]
20 000​
[/td]
[td]0,14 s[/td]
[td]1,93 s[/td]
[td]0,17 s[/td]
[td]0,245 s[/td]
[/tr]
[tr]
[td]
50 000​
[/td]
[td]0,45 s[/td]
[td]28,4 s[/td]
[td]0,41 s[/td]
[td]0,61 s[/td]
[/tr]
[tr]
[td]
100 000​
[/td]
[td]1,31 s[/td]
[td]3 min 41 s[/td]
[td]
-​
[/td]
[td]
-​
[/td]
[/tr]
[tr]
[td]
200 000​
[/td]
[td]4,02 s[/td]
[td]25 min 47 s[/td]
[td]
-​
[/td]
[td]
-​
[/td]
[/tr]
[tr]
[td]
500 000​
[/td]
[td]14,4 s[/td]
[td]3 h 56 min 29 s[/td]
[td]
-​
[/td]
[td]
-​
[/td]
[/tr]
[tr]
[td]
1 000 000​
[/td]
[td]28 s[/td]
[td]
?​
[/td]
[td]
-​
[/td]
[td]
-​
[/td]
[/tr]
[/table]
Sans commentaire.​


Bonne journée.


ℝOGER2327
#7947


Lundi 16 Gidouille 142 (Saint Inventaire, poète - fête Suprême Quarte)
12 Messidor An CCXXIII, 1,1549h - artichaut
2015-W27-2T02:46:18Z
 
Dernière édition:
Re : Renvoyer une liste sans les doublons

Bonjour,
Sans commentaire
Oh mais si quand même (sinon ce n'est pas drôle) !
Bon ben on est bloqué par l'incapacité de cette fonction Transpose à pouvoir transposer des Arrays contenant plusieurs centaines de milliers de valeurs...un comble tout de même !
Parce que le dictionnaire en lui même rivalise bien avec le RemoveDuplicates mais après on reste bloqué.
Une solution serait de réinjecter les données de l'array dans la feuille :
Code:
Private Sub Worksheet_Activate()
Dim D As Object, Pl As Range, Pl2 As Range, R As Range, i&, temp

  With Application: .ScreenUpdating = 0: .EnableEvents = 0: .Calculation = -4135: .DisplayAlerts = 0: End With
  Set D = CreateObject("Scripting.Dictionary")
  With Me.[A1]: .Parent.Range(.Cells, .End(xlDown)).Clear: End With
  With Sheets("Feuil1"): Set Pl = .Range(.Cells(1, 1), .Cells(1, 1).End(xlDown)): End With
  For Each R In Pl: D(R.Value) = "": Next
  temp = D.keys
  Set Pl2 = Me.[A1].Resize(D.Count, 1)
  For Each R In Pl2: R = temp(i): i = i + 1: Next R
  Set D = Nothing
  With Application: .DisplayAlerts = 1: .Calculation = -4105: .EnableEvents = 1: .ScreenUpdating = 1: End With
End Sub

J'ai testé sur 1048576 lignes : bon il n'y a pas photo entre l'onglet K1 (20 s) et celui-là (27 s) mais cela permet toujours de s'en sortir à moindre frais lorsque l'on travaille à partir d'un tableau VBA.
Quant au filtre avancé il s'est noyé lors du test.

Une question concernant votre procédure : pourquoi passer par une feuille temporaire au lieu de lancer le RemoveDuplicates directement dans l'onglet K1 ?
A+
 
Re : Renvoyer une liste sans les doublons

Re...

D'accord avec vous.
La fonction Transpose est (comme bien d'autres) obsolète. On se croirait au temps de l'iAPX 286...
Il faudra un jour que les techniciens reprennent les manettes aux commerciaux/financiers/communicants et autres charlatans dispensateurs de poudre aux yeux...

Sûr qu'il convient d'écrire un substitut. J'avais commencé avec ça :​
Code:
Private Sub Worksheet_Activate()
Dim i&, a(), b(), d As New Scripting.Dictionary
    With Application: .ScreenUpdating = 0: .EnableEvents = 0: .Calculation = -4135: End With
    With Me.[A1]: .Parent.Range(.Cells, .End(xlDown)).Clear: End With
    With Sheets("Feuil1"): Me.[A1].Value = .Cells(1, 1).Value: a = .Range(.Cells(1, 1), .Cells(1, 1).End(xlDown)).Value: End With
    For i = 2 To UBound(a): d(a(i, 1)) = "": Next
    b = d.keys
    Set d = Nothing
    ReDim a(UBound(b), 0)
    For i = 0 To UBound(b): a(i, 0) = b(i): Next
    Me.[A1].Offset(1).Resize(UBound(b) + 1, 1) = a
    With Application: .Calculation = -4105: .EnableEvents = 1: .ScreenUpdating = 1: End With
End Sub

Rapide. Comparaison :

[table="width: 300, class: grid, align: center"]
[tr]
[td]
n​
[/td]
[td]
Onglet K1​
[/td]
[td]
Procédure
ci-dessus​
[/td]
[/tr]
[tr]
[td]
10 000​
[/td]
[td]0,07 s[/td]
[td]0,06 s[/td]
[/tr]
[tr]
[td]
20 000​
[/td]
[td]0,14 s[/td]
[td]0,10 s[/td]
[/tr]
[tr]
[td]
50 000​
[/td]
[td]0,46 s[/td]
[td]0,22 s[/td]
[/tr]
[tr]
[td]
100 000​
[/td]
[td]1,32 s[/td]
[td]0,46[/td]
[/tr]
[tr]
[td]
200 000​
[/td]
[td]4,00 s[/td]
[td]1,26 s[/td]
[/tr]
[tr]
[td]
500 000​
[/td]
[td]14,21 s[/td]
[td]5,38 s[/td]
[/tr]
[tr]
[td]
1 000 000​
[/td]
[td]27,49 s[/td]
[td]14,43 s[/td]
[/tr]
[/table]


Mais pas convenable ici, car le demandeur semble vouloir copier le formatage des cellules d'origine. (Personnellement, je ne pense pas que ce soit bien utile dans le traitement d'une base de données, mais chacun [sauf le Grec, bien sûr !] est libre de ses opinions.)
C'est pourquoi j'ai proposé le code de l'onglet K1, qui conserve le formatage.​


Une question concernant votre procédure : pourquoi passer par une feuille temporaire au lieu de lancer le RemoveDuplicates directement dans l'onglet K1 ?
A+
J'avais écrit une procédure travaillant directement dans la feuille de données, mais elle n'était pas sensiblement plus rapide. J'ai donc opté pour la feuille intermédiaire par souci de sécurité : un dysfonctionnement de la procédure a moins de chance de bousiller la feuille de données...


Voilà, voilà.


ℝOGER2327
#7948


Lundi 16 Gidouille 142 (Saint Inventaire, poète - fête Suprême Quarte)
12 Messidor An CCXXIII, 7,2388h - artichaut
2015-W27-2T17:22:23Z
 
Re : Renvoyer une liste sans les doublons

Oui Roger c'est effectivement mieux de transposer l'array dans un autre array avant de le copier dans la feuille plutôt que de transposer de l'array vers la feuille (j'aurai dû y penser !).
Chez moi 24 sec en K1 et 16 sec avec la procédure ci-dessus.

Pour contourner la limite de la fonction Transpose, il y a des objets dans des DLL Windows …
vas-y Marc propose que l'on puisse tester !
A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
17
Affichages
421
Réponses
9
Affichages
392
Réponses
2
Affichages
167
Réponses
4
Affichages
478
Réponses
11
Affichages
260
Réponses
2
Affichages
79
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…