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

XL 2013 les machistes (utilisateurs de Mac OS peuvent ils tester ceci

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
@RyuAutodidacte m' a rappelé un lien vers un amis de l'autre monde concernant une classe pseudo dictionnaire pour MAC
malgré que j'apprécie beaucoup l'auteur (avec qui j'ai même collaboré sur l’accélérateur de requête entre autres ) ,je trouve que c'est un peu usine à gaz

j'ai donc fait les choses à ma façon
mais avant d'aller plus loin car des idées j'en ai plein ,si vous êtes un utilisateur sur MAC pouvez vous tester ce pseudo dictionnaire
sur Windows ça match il me faut confirmation sur MAC

Merci pour vos retours
 

Pièces jointes

  • classe dictionary pour Mac.xlsm
    18.3 KB · Affichages: 10
Dernière édition:

RyuAutodidacte

XLDnaute Impliqué
Re à tous,
@patricktoulon
j'ai l'impression d'avoir un pb avec les tri.
Peux tu tester chacun et me confirmer ou infirmer stp … ?
VB:
Sub NewQuickSorts()
    Dim Tb
    Tb = Array("toto§45", "titi§12", "U3§Usine3", "riri§27", "fifi§85", "Patrick§ClasseB2P", "toto§34llou", "E3§Entreprise3", "loulou§94", "tutu§62", "Robert§ClasseB2R", "toto1§12", "toto2§45", "Dranreb§ClasseC3D", "U2§Usine2", "E1§Entreprise1", "tata§13", "fifi§18", "Julien§ClasseA1J", "titi§73", "E2§Entreprise2", "U1§Usine1", "Ryu§ClasseB2T", "mapomme§ClasseC3M")
'    Tb = SortQuickSort(Tb, 1, -1, -1, 167) '        tri par suffixe croissant full argument(argument sepa en numerique)
'    Tb = SortQuickSort(Tb, 1, -1, -1, "§") '        tri par suffixe croissant full argument(argument sepa en string)
'    Tb = SortQuickSort(Tb, 2) '                    tri par chaine complète decroissant
    'Tb = SortQuickSort(Tb, 1)  '                   tri par chaine complète croissant
    'Tb = SortQuickSort(Tb, Sepa:="§") '            tri par suffixe (croissant par defaut) (argument sepa en string)
'    Tb = SortQuickSort(Tb, Sepa:="à")    '          (test avec un mauvais separateur) tri par suffixe (croissant par defaut) (argument sepa en string)

    MsgBox Join(Tb, vbNewLine)
End Sub



Function SortQuickSort(tbl, _
                       Optional Sortmode& = 1, _
                       Optional Gauche& = -1, _
                       Optional Droite& = -1, _
                       Optional Sepa As Variant = "~")   ' Quick sort

    Dim ref, G&, D&, temp1, First, tim#
    If Droite = -1 And Gauche = -1 Then First = 1 Else First = 0

    Droite = IIf(Droite = -1, UBound(tbl), Droite)

    If Val(Sepa) > 0 Then Sepa = Chr(Sepa)
    Gauche = IIf(Gauche = -1, LBound(tbl), Gauche)

    ref = tbl((Gauche + Droite) \ 2)

    G = Gauche: D = Droite

    Do
        If Sortmode = 1 Then
            Do While Split(tbl(G), Sepa)(Abs(tbl(G) Like "*" & Sepa & "*")) < Split(ref, Sepa)(Abs(ref Like "*" & Sepa & "*")): G = G + 1:: Loop
            Do While Split(ref, Sepa)(Abs(ref Like "*" & Sepa & "*")) < Split(tbl(D), Sepa)(Abs(tbl(D) Like "*" & Sepa & "*")): D = D - 1:: Loop
        Else
            Do While Split(tbl(G), Sepa)(Abs(tbl(G) Like "*" & Sepa & "*")) > Split(ref, Sepa)(Abs(ref Like "*" & Sepa & "*")): G = G + 1:: Loop
            Do While Split(ref, Sepa)(Abs(ref Like "*" & Sepa & "*")) > Split(tbl(D), Sepa)(Abs(tbl(D) Like "*" & Sepa & "*")): D = D - 1:: Loop
        End If

        If G <= D Then
            temp1 = tbl(G): tbl(G) = tbl(D): tbl(D) = temp1
            G = G + 1: D = D - 1
            Ch = Ch + 1
        End If
        Debug.Print "résultat " & Join(tbl)
        Debug.Print "et on reboucle jusqu'a que G soit > D"
    Loop While G <= D

    If G < Droite Then x = SortQuickSort(tbl, Sortmode, G, Droite, Sepa): Debug.Print "c'est  G(pas Gauche qui est  < Droite trouvé on relance la fonction en appel récursif avec le nouveau gauche et droite  donc G et droite "

    If Gauche < D Then x = SortQuickSort(tbl, Sortmode, Gauche, D, Sepa): Debug.Print "c'est   Gauche(pas G) qui est  < D trouvé on relance la fonction en appel récursif avec le nouveau gauche et droite  donc G et droite "

    If First = 1 Then SortQuickSort = tbl
End Function
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour Ryu
ben ma foi c'est normal tu tri avec des mots en nom propre et des mots en minuscule
les majuscule n'ont pas le même code asc que les minuscule
met option compare text en haut de module tout simplement
LOL
je suis pas sur que l'on va la voir un jour ta classe dico tout du moins sur ce site
 

RyuAutodidacte

XLDnaute Impliqué

RyuAutodidacte

XLDnaute Impliqué
Du coup tu l'a mis Option Compare Text dans ton code ou pas ?

Edit : je vois que Excel tri naturellement via le filtre tableau ou le filtre automatique (Compare Text) alors que vba utilise par défaut Compare Binary et pas Compare Text
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
ben bien sur depuis le debut
a partir du moment ou tu fait une comparaison de text dans une macro ou fonction
tu compare avec le mode en adéquation avec ton intention
c'est la base
sinon tu a une solution qui est simple aussi
c'est de tester tes deux do/ loop G et D en ucase
VB:
 If Sortmode = 1 Then
            Do While UCase(Split(tbl(G), Sepa)(Abs(tbl(G) Like "*" & Sepa & "*"))) < UCase(Split(ref, Sepa)(Abs(ref Like "*" & Sepa & "*"))): G = G + 1:: Loop
            Do While UCase(Split(ref, Sepa)(Abs(ref Like "*" & Sepa & "*"))) < UCase(Split(tbl(D), Sepa, 1)(Abs(tbl(D) Like "*" & Sepa & "*"))): D = D - 1:: Loop
        Else
            Do While UCase(Split(tbl(G), Sepa)(Abs(tbl(G) Like "*" & Sepa & "*"))) > UCase(Split(ref, Sepa)(Abs(ref Like "*" & Sepa & "*"))): G = G + 1:: Loop
            Do While UCase(Split(ref, Sepa)(Abs(ref Like "*" & Sepa & "*"))) > UCase(Split(tbl(D), Sepa, 1)(Abs(tbl(D) Like "*" & Sepa & "*"))): D = D - 1:: Loop
        End If
pas compliqué
 

RyuAutodidacte

XLDnaute Impliqué
Re à tous,
Vous l'attendiez tous … ou tout du moins @patricktoulon qui m'attend au tournant
PS : Merci à Patrick pour son tri en quicksort
Ben voilà mon 1er module de classe (merci d'être indulgent) … mais avant toute chose :

DISCLAIMER :
Je sais bien que l'on parle du dictionnaire, mais j'ai voulu faire qq ch de différent
en alliant le Dictionnaire et la Collection …

Ce qui fait que l'on se retrouve de base avec :
  • l'index de clé automatique si besoin
  • l'insertion avant ou après une clé
  • Overwrite des items sur la même clé
  • Le cumule des items
Autre point avant que l'on cri au scandale … j'ai travaillé mon code avec Item/clé (plus facile pour moi puisque habitué)
En soit ce n'est pas grave car ceux sont les 2 composantes du Dictionnaire et de la Collection
Pour avoir Clé/Item, il faudra inverser certaine partie dans le code

Mon but a été aussi de minimiser les boucles …
Voilà tout pour le disclaimer

Pour les tests plusieurs Sub dans le module 1 + Feuil1 :
  1. TestLaBaseDeDicoColl
  2. TestDicoCollTests
  3. DicoCollToTable
  4. DicoCollTri
PS : j'ai mis des Stop si vous voulez checker les variables locales => Faire F5 alors pour la suite …
j'ai peut être omis certaines petites explications car j'ai du revoir des points dans mon code en préparant les exemples.

Le fichier :

Edit dans le disclaimer
 

Pièces jointes

  • DicoColl.xlsm
    51.3 KB · Affichages: 2
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
ho mais pas besoins de me le dire , j'avais déjà compris ton intention

si je te dis que c'est une erreur va tu essayer de chercher pourquoi tout seul ou va t il falloir que je le dise

d'autant plus que tu a presque répondu tout seul

au mieux comme je l'ai fait le faire dans une ToTableFILTER LOL

Allez je te laisse réfléchir a la question
 

patricktoulon

XLDnaute Barbatruc
bon ....j'ai testé
ben on fera avec
j'avoue j'ai peur d'y mettre les mains
mais je respecte le travail fourni
en tout cas tu es allé jusqu'au bout
je vais essayer d’étudier ta démarche

souviens toi j'ai enclenché cette discussion pour faire une moins grosse usine à gaz que MarL
sur ce point c'est raté

tu me rappelle moi a mes débuts
toujours plus toujours plus avant de maitriser l'essentiel

tu pourrais essayer de faire simple
un dico clé item sans toutes les autres truc afin que je puisse avoir envie d'aller mettre les mains dedans
quitte a ce que l'on revienne sur tes options par la suite

la en l’état je me vois mal la mettre dans le recueil ne sachant pas en expliquer le process

d'ailleurs en 5/6 phrases ( ca ne devrait pas demander plus)serais tu capable de m'expliquer le fonctionnement de base( add cle item) sans tout tes à coté
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…