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
 

gosselien

XLDnaute Barbatruc
Merci pour ta solution Yurperqod

A vrai dire je recherchais une solution logique en VBA, sans copier de données inutiles dans mon classeur vu la quantité importantes de données concernées.
Bonjour,

c'est un peu contradictoire puisque d'une part, tu as de nombreuses données et d'autres part, tu ne veux pas de dictionnaire, hors c'est la méthode utilisée avec les array/tableaux pour traiter vite de grands nombres de lignes....
 

GeoTrouvePas

XLDnaute Impliqué
Ola mais c'est que je me ferai presque tomber dessus !

@Yurperqod : 1) le terme de logique était employé dans le sens de "raisonnement". Cela n'avait rien à voir avec une notion d'illogique. J'aurai certes du préciser que le volume de données pouvait devenir conséquent à terme. Après un fichier exemple ne reflète jamais parfaitement la réalité, sinon ça ne serait pas un fichier exemple. 2) Je l'ai bien vu et je t'en ai remercié.

@gosselien : ça n'a rien de contradictoire. Ce n'est pas que je ne VEUX pas mais que je ne PEUX pas utiliser le dictionnaire. Les array et tableaux restent une solution envisageable car ils différents des dictionnaires puisqu'ils ne nécessitent pas de devoir passer par une gestion d'erreur.

Je ne pensais pas suscité de telles réactions de votre part. Je vais plutôt essayer de calmer le jeu et trouver une solution par moi même.

Merci pour votre participation.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je me serais tous naturellement orienté vers cette solution.

Remarque: s'ils sont destinés à devenir des titres de colonnes, j'ai d'autre modules de service pour les établir et aussi ensuite l'ensemble du rapport les comportant.
 

Pièces jointes

  • SujetCBxGeoTrouvePas.xlsm
    48.7 KB · Affichages: 62
Dernière édition:

GeoTrouvePas

XLDnaute Impliqué
Bonjour Bernard et PierreJean et merci pour votre participation,

@Bernard : Je suis impressionné par ta solution. Elle me paraît très complexe par rapport à ce que je veux faire mais je pense apprendre pas mal de choses en l'étudiant de près.

@pierrejean : Je vois que l'on a les mêmes sources ^^ (un grand merci à Jacques BOISGONTIER au passage) J'ai passé ma pause repas à gratter une solution et je me suis finalement rappelé avoir employé la même méthode dans une application il y a quelques années. Pour ceux que ça intéresserait, ça ressemble à ça après l'avoir retravaillée et adaptée :

VB:
Sub TriSansDoublon(ByVal MaPlage As Range, CelluleDest As Range)
    Set MonDico = CreateObject("Scripting.Dictionary")
    For Each Cellule In MaPlage.Cells
        MonDico.Item(Cellule.Value) = Cellule
    Next
    If MonDico.Count > 0 Then
        DicoTempo = MonDico.Items
        Call TriAlpha(DicoTempo, LBound(DicoTempo), UBound(DicoTempo))
    End If
    CelluleDest.Resize(, UBound(DicoTempo)).Value = DicoTempo
End Sub
Public Sub TriAlpha(a, gauc, droi)
    Dim ref As String
    Dim g As Double
    Dim d As Double
    Dim temp As String
    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
            temp = a(g): a(g) = a(d): a(d) = temp
            g = g + 1: d = d - 1
        End If
    Loop While g <= d
    If g < droi Then Call TriAlpha(a, g, droi)
    If gauc < d Then Call TriAlpha(a, gauc, d)
End Sub

@Ce lien n'existe plus : Non pour les raisons évoquées ci - dessus.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Elle me paraît très complexe par rapport à ce que je veux faire
4 lignes de code ! Complexe ??
(la complexité des modules de service, elle, ne compte pas. Pas plus que la complexité bien plus grande encore de tout le code auquel vous n'avez même pas accès, dans les bibliothèques. Mais si l'aide sous forme de commentaires n'est pas suffisante ni claire pour l'utilisation sans chercher à comprendre comment ça marche dedans, il faut me le signaler)
 
Dernière édition:

klin89

XLDnaute Accro
Bonsoir à tous, :)

Une autre façon de procéder :
VB:
Sub test()
Dim e
    With CreateObject("System.Collections.ArrayList")
        For Each e In Range("b3", Range("b" & Rows.Count).End(xlUp)).Value
            If Not .Contains(e) Then .Add e
        Next
        .Sort
        Range("f3").Resize(, .Count).Value = .ToArray
    End With
End Sub
klin89
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

Pour le fun, un fichier permettant de comparer cinq méthodes issues ou non du fil.
Pour débuter, cliquer sur le bouton Init puis cliquer sur les autres boutons.

@GeoTrouvePas:
Je pense qu'il faut remplacer dans ton code:
CelluleDest.Resize(, UBound(DicoTempo)).Value = DicoTempo
par:
CelluleDest.Resize(, UBound(DicoTempo)+1).Value = DicoTempo
car DicoTemp a pour base 0 et non 1.
 

Pièces jointes

  • GeoTrouvePas-diff. méthodes- v1.xlsm
    26.4 KB · Affichages: 63
Dernière édition:

Si...

XLDnaute Barbatruc
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) !
upload_2016-8-3_7-57-9.png
 

GeoTrouvePas

XLDnaute Impliqué
Mais quelle avalanche de réponses ^^

@Dranreb : Non je me suis mal exprimé. Disons que ta solution paraît très simple dans la mesure ou il n'y a que 4 lignes de code à adapter La complexité réside seulement dans la compréhension du module "MSujetCbx" et du module de classe. Même si le code est parfaitement commenté, je ne fais jamais de copier coller sans être sûr de savoir parfaitement comment ça fonctionne. En tout cas je vais me régaler en étudiant ce code.

@klin89 : Merci pour cette solution qui semble être la plus simple de toute

@mapomme : Très fun ton petit comparatif, j'adore ! J'ai rajouté la méthode de Dranreb et voici le comparatif en pièce jointe. C'est ta première méthode qui l'emporte, haut la main ! Et merci pour la petite erreur que je n'avais pas vu.

Un grand merci à tous pour votre participation active
 

Pièces jointes

  • Eval.PNG
    Eval.PNG
    9.5 KB · Affichages: 62

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 206
Messages
2 086 217
Membres
103 158
dernier inscrit
laufin