XL 2016 Trier chaine de caractères dans une cellule

Marek83

XLDnaute Nouveau
Bonjour,

dans la cellule A1 j'ai la chaine suivante P Q R S K L H F I M E G N O J W Y X Z AA AB AC AD AE AO AN AP AQ AR AS BI

J'aimerai classer cette chaine dans l'ordre du type
E F H G K L N O P Q R S ...puis AA AB AC.

Bon, si le classement commence par AA jusqu'à ZZ c'est pas grave.
De même s'il fait : A AA AB AC....B E F G H....ca me va aussi.

Merci pour votre aide.
 

patricktoulon

XLDnaute Barbatruc
re
bonsoir
tiens c'est marrant ton truc ;)

exemple de formule
=StringSort(A1)
le code dans un module standard
VB:
Function StringSort(chain)
    Dim T, i&, a&, q&, z&, mem
    T = Split(chain, " ")
    
    'premier tri par la longueur de chaine
    ReDim tx(UBound(T))
    b = 1
    For i = LBound(T) To UBound(T)
        If Len(T(i)) = 1 Then q = q + 1: a = a + 1: tx(a - 1) = T(i) Else b = b - 1: tx(UBound(T) + b) = T(i)
    Next
    q = q - 1
    
    '2d tri uniquement les chaines de 1 caractères
    For i = LBound(tx) To q - 1
        For z = i + 1 To q
            If tx(i) > tx(z) Then mem = tx(i): tx(i) = tx(z): tx(z) = mem
        Next
    Next
    
    '3eme tri les chaines de deux caractères
    For i = q + 1 To UBound(tx) - 1
        For z = i + 1 To UBound(tx)
            If tx(i) > tx(z) Then mem = tx(i): tx(i) = tx(z): tx(z) = mem
        Next
    Next

    StringSort = Join(tx, " ")
End Function
demo

demo.gif
 

Gégé-45550

XLDnaute Accro
Bonjour,

dans la cellule A1 j'ai la chaine suivante P Q R S K L H F I M E G N O J W Y X Z AA AB AC AD AE AO AN AP AQ AR AS BI

J'aimerai classer cette chaine dans l'ordre du type
E F H G K L N O P Q R S ...puis AA AB AC.

Bon, si le classement commence par AA jusqu'à ZZ c'est pas grave.
De même s'il fait : A AA AB AC....B E F G H....ca me va aussi.

Merci pour votre aide.
Bonjour,
avec un fichier exemple et un aperçu du résultat attendu ce serait mieux.
Avec ce que j'ai compris, voici une possibilité avec une requête PQ.
Cordialement,
 

Pièces jointes

  • Test requête.xlsx
    17.6 KB · Affichages: 5

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @Marek83, à tous, :)
J'ai supprimé mon précédent message car la fonction était fausse !

Voici la fonction TrierNbcarValeur() qui trie par longueur puis par valeur les mots d'une cellule (les mots peuvent avoir un nombre quelconque de caractères). La fonction ne distingue pas les majuscules des minuscules (s'il faut distinguer la casse alors remplacer vbTextCompare par vbBinaryCompare dans le code).

Le code de la fonction :
VB:
Function TrierNbcarValeur(ByVal x As String) As String
Dim t, i&, aux, ech As Boolean
   t = Split(Application.Trim(x))
   For i = 0 To UBound(t): t(i) = Format(Len(t(i)), "0000000000") & Chr(135) & t(i): Next
   Do
      ech = False
      For i = 0 To UBound(t) - 1
         If StrComp(t(i), t(i + 1), vbTextCompare) = 1 Then ech = True: aux = t(i): t(i) = t(i + 1): t(i + 1) = aux
      Next i
   Loop While ech
   For i = 0 To UBound(t): t(i) = Split(t(i), Chr(135))(1): Next
   TrierNbcarValeur = Join(t)
End Function
 

Pièces jointes

  • Marek83- trier une cellule- v1.xlsm
    22.5 KB · Affichages: 7
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour à tous,

Même tri que mapomme, mais avec la macro Quick sort :
VB:
Option Compare Text 'la casse est ignorée

Function TrierCellule(x$)
Dim a, i&
a = Split(Application.Trim(x))
For i = 0 To UBound(a)
    x = a(i)
    a(i) = String(99 - Len(x), " ") & x
Next
tri a, 0, UBound(a)
For i = 0 To UBound(a)
    a(i) = LTrim(a(i))
Next
TrierCellule = Join(a)
End Function

Sub tri(a, gauc, droi) ' Quick sort
Dim ref, g, d, temp
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 tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
A+
 

Pièces jointes

  • TrierCellule.xlsm
    17.3 KB · Affichages: 3

patricktoulon

XLDnaute Barbatruc
re
Bonjour à tous
bref on est toujours à, trois boucles

boucle 1
(les chaine 1char a gauche) les (chaine 2 char a droite)(DANSLE MËME ARRAY!!)
récupération de l'index de la dernière chaine a 1 char

boucle 2
tri des chaineS 1 CHAR de lbound a l'index récupéprécedemment(tri a bulle)

boucle 3
tri des chaineS 2 CHAR de l'index récupéprécedemment au ubound de l'array ( tri a bulle)

le resultat
les chaines 1 char à gauche dans l'ordre ALPHA
les chaines 2 char à droite dans l'ordre ALPHA

le quicksort pour une 50 aine caractères c'est ,pas un peu comme prendre un tractopelle pour replanter un géranium 🤪

mais c'est intéréssant ceci
VB:
For i = 0 To UBound(a)
    x = a(i)
    a(i) = String(99 - Len(x), " ") & x
Next
ok je sors
 
Dernière édition:

job75

XLDnaute Barbatruc
J'ai l'impression que même des gens chevronnés n'ont pas compris comment fonctionne Quick sort.

En comparant les bornes de l'intervalle avec son centre on réduit considérablement le nombre d'itérations, c'est pour ça que cette macro est si rapide.
 

patricktoulon

XLDnaute Barbatruc
re
et d'autre n'ont pas compris pas le tri fusion 🤪
et ma version post#2 s'approche clairement de la méthode tri fusion
le trie fusion consiste a parceller le tableau en plus petit tableau j'usqu'a obtenir des petit tableau du min (2 items ou 3) et de les trier et ensuite les rappatrier dans une variable tableau dimentionnée a l'initiale(voir la video dans les ressources "un receuil de méthode de tri
le quicksort et le tri fusion sont a ce jour les méthodes plus rapides et les plus couremment utilisées vient ensuite(un peu moins rapide ) le tri shell metzner
dans tout les cas ses méthode sont taguées de la même facon "(divide and rule)soit diviser pour mieux reigner"

je t'invite a tester le post 2 et de mesurer les temps avec la tienne
et puis tiens un petit classeur en démo
demo.gif


voila
 

Pièces jointes

  • exemple pour job75.xlsm
    121.3 KB · Affichages: 2

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @job75 :) ,

J'ai l'impression que même des gens chevronnés n'ont pas compris comment fonctionne Quick sort.

Rassure toi @job75, je le savais et pourtant je ne suis pas chevronné :(.

Le seul inconvénient de QS est que c'est un tri qui n'est pas un tri stable. Mais très peu de tris rapides le sont (le vrai tri fusion est stable) et on n'a pas toujours besoin de la stabilité. Le tri d'Excel lui est stable.

 

patricktoulon

XLDnaute Barbatruc
en fait pourquoi ces methodes de tri sont plus rapide
et bien parce que la quantité de memoire est exponentielle
j'explique
vous prenez un tableau de 1000 vous le triez
il consomme X octet en memoire et X et temps/ octets en procc

vous prenez le même tableau
vous le coupez en deux
ces deux sub tableaus pesent non pas la moité mais beaucoup moins
et a trier il peseront tout aussi moins

le quiksort et basé sur un pivot entre bornes
on ramene tout ce qui est plus petit que pivot a gauche et inversement ce qui est plus grand a droite
le tout dans un double do/loop de gauche a droite et de droite a gauche
et on recommence jusqu'a que g et d soit identiques ou respectivement > ou < que l'autre
ce qui fait que en effet les boucle ne tourne pas sur le même (entres bornes et donc pivot )
len general on commence par les bornes lbound et ubound et le pivot sera le milieu

le tri fision lui decoupe hache menu menu le tableau pour en faire des petit bébé tableau de 2 ou 3 si nombre ubound impair et il tri ces bébés tableau et les rapatries dans un tableau dimentionné a l'initial

il est donc très compréhensible etant donné que plus on a un petit tableau moins les capacités sont solicitées

pour vous la faire courte
supposons qu'un tableau de 1000 pèse 1mega en memoire (je dis ca au hasard hein)
et bien si vous decoupez ce tableau par 500(tri fusion) il ne pezera plus que peut être 20/30 kilo à trier
c'est pour vous dire a quel point l'exponentialité de la consomation , selon la méthode peut être importante

et c'est pareil pour le Quiksort et sont (entre bornes sur pivot )

voila pourquoi c'est plus rapide
c'est bien ça hein job75 ? 🤪
 

patricktoulon

XLDnaute Barbatruc
Post #2 => 0,395 millième de seconde.

Post #7 => 0,36 millième de seconde.

Mais les macros ne font pas la même chose...
re
ok alors il y a certainement d'autre paramètres a prendre en compte
car si chez toi on est à 0.290 de plus avec ma méthode
alors que chez moi avec ma méthode ,on est a ton temps / par un peu plus de 3
la différence au niveau memoire/procc est énorme c'est un gouffre béant a cette echelle
 

Discussions similaires

Statistiques des forums

Discussions
315 089
Messages
2 116 098
Membres
112 661
dernier inscrit
ceucri