XL 2016 Doublons et tri sans collection

GeoTrouvePas

XLDnaute Impliqué
Bonjour le forum,

Je dispose dans une colonne, d'une liste de données désordonnée comportant des doublons.

Mon souhait serait de transposer cette ligne sur une autre feuille après avoir trié cette liste par alpha et supprimer les doublons.

Je sais qu'on peut supprimer les doublons via l'objet collection mais vu que pas mal de postes sont paramétrés en "Arrêt sur toutes les erreurs", je ne peux pas l'utiliser.

Auriez vous une suggestion ?

Je vous remercie par avance
 

GeoTrouvePas

XLDnaute Impliqué
comment fait on ça en entreprise ? ça ne dépend pas de l'acceptation ou non des macros ?P.

Ce paramètre est complètement indépendant de l'acceptation des macros. Il est modifiable via l'éditeur Vba, sa valeur par défaut est "Arrête sur les erreurs non gérées" mais personnellement, quand je développe des outils, je préfère le positionner sur "Arrêt sur toutes les erreurs".
 

Dranreb

XLDnaute Barbatruc
C'est quoi ces durées ?
La modification d'un élément de la liste se répercute instantanément sur le résultat dans ma solution du #10
Ah oui, je n'avais pas vu, c'est pour 400000 éléments…
Il faut dire que la Function SujetCBx établit plus de choses que seulement la liste classée sans doublon. Celle ci n'est qu'un sous produit.
 
Dernière édition:

GeoTrouvePas

XLDnaute Impliqué
@Yurperqod : Parce que je n'ai rajouté la méthode de Dranreb qui présentait un réel intérêt de par son adaptabilité et son niveau de finition.

@Dranreb : C'est le temps de 'exécution de chaque macro pour les 400k éléments. J'ai moi aussi été étonné par le délai important de ta méthode. N'ayant pas encore eu le temps de l'analyser, je me disais que ça devait cacher bien d'autres possibilités sous jacentes
 

Yurperqod

XLDnaute Occasionnel
Bonjour le forum

Je croyais que l'essentiel était de participer et qu'aucune proposition de solution n'était ni bonne ni mauvaise.
Je préfère ainsi moi-même m'ostraciser en supprimant mes macros de cette discussion qui n'aime pas les gens simplement francs dans leur discours.
 

GeoTrouvePas

XLDnaute Impliqué
@Yurperqod : Il est dommage que tu réagisses de cette façon. Il n'a jamais été dit que ta solution était bonne ou mauvaise. Tu as participé et tu en as même été remercié. As tu pris la peine de consulter les solutions proposées par les autres participants ?
Jettes un coup d'oeil au comparatif et tu verras que ta solution est assez proche de celle proposée par un autre participant au point qu'elle utilise les mêmes méthodes. Il aurait donc été inutile de reprendre ton code, de l'adapter et de l'intégrer dans le comparatif pour obtenir au final le même résultat qu'avec l'autre procédure qui elle était bonne à être utilisée directement.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir Si...:) ,
Salut

Petite remarque mais qui peut avoir son importance selon le contexte !

Pas fun : quelle que soit la méthode, Excel coince quand la liste sans doublon contient plus d’items que le nombre de colonnes disponibles (de la version) !
Regarde la pièce jointe 970008

Si... me cherche des poux, il va me trouver... (Humour :);):rolleyes:)

Hé, hé! j'avais vu et c'est pourquoi ma formule pour l'initialisation est telle que je l'ai écrite (on aura jamais plus de 14950 termes distincts qui tiennent tous sur une ligne à/c de Excel 2007 sur l'exemple fourni). Mais, pour tout avouer, je n'avais pas envie de reprendre toutes les procédures pour y inclure le test:confused:
 

laetitia90

XLDnaute Barbatruc
bonjour toutes:):) & tous:):)

pour le dico si on passe pas par une liaison tardive plus rapide?? mais il faut activer la ref..

Sub es()
Dim t(), i As Long, m As New Dictionary, s As Long, te
s = Timer
Application.ScreenUpdating = 0
t = Feuil1.Range("b3:b" & Feuil1.Cells(Rows.Count, 2).End(3).Row)
For i = 1 To UBound(t): m(t(i, 1)) = t(i, 1): Next i
te = m.keys
Call tri(te, LBound(te), UBound(te))
[f3].Resize(1, m.Count) = te
MsgBox Timer - s
End Sub

Sub tri(a, gauc, droi)
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
te = a(g): a(g) = a(d): a(d) = te
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonsoir Paritec
Laetitia voulait sans doute parler de liaison anticipée. C'est celle là qui établit au moment de la compilation l'offset d'une méthode ou d'une propriété d'un objet spécifique (c'est à dire d'un autre type que Object) pour qu'au moment de l'exécution l'accès y soit direct.
La liaison tardive est celle qui est plus lente puisqu'elle consiste à aller chercher dans une table au moment de l'exécution l'adresse du code ou de la donnée d'après le nom de la méthode ou de la propriété spécifié dans le code source.
 

pierrejean

XLDnaute Barbatruc
Salut à tous
A mon avis 3 raisons pour expliquer la meilleure rapidité
1 ) ajout de référence pour l’accès au dictionnaire au lieu de createobject..... (cf Dranreb)
2) mise au préalable en tableau (t = Feuil1.Range("b3:b" & Feuil1.Cells(Rows.Count, 2).End(3).Row))
3) pas de rafraîchissement d’Écran (Application.ScreenUpdating = 0)
 

laetitia90

XLDnaute Barbatruc
re toutes :):) & tous:):)

milles excuses :( mal rediger mon post il fallait comprendre

pour le dico si on passe pas par une liaison tardive moins rapide??

autrement l'ami Dranreb;) resumé bien la différence des 2 methodes

certains aussi ....parle de liaison précoce....

a+ leti
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 370
Messages
2 087 691
Membres
103 641
dernier inscrit
anouarkecita2