XL 2019 Classer des chiffres dans des cellules horizontales.

album40

XLDnaute Nouveau
Bonjour,
Je souhaite classer par ordre croissant des chiffres dans des cellules horizontales.
J'ai tenté de le faire par la fonction trier par ordre croissant je n'obtient pas le résultat voulu
c'est la première ligne seule qui me donne le bon résultat. je n'arrive pas a faire tout le tableau simultanément.
Merci de me donner l'astuce
 

Pièces jointes

  • ORDRE CROISSANT.xlsx
    9.5 KB · Affichages: 17
Solution
Bonsoir, Patricktoulon, Staple1600
il faut juste faire un Tri d’un tableau (Array) à 1 dimension
Le coeur du programme est simple pour le reste c'est le principe du tri quickSort

VB:
Sub MiseEnForme()
Dim t() As Variant, i As Integer, j As Integer
ReDim t(1)
For i = 7 To ActiveSheet.Cells(ActiveSheet.Cells(65535, 3).End(xlUp).Row, 3).Row
    t(i - 6) = Range(Cells(i, 3), Cells(i, 7))
    tri t, i - 6, LBound(t(1), 2), UBound(t(1), 2)
    ReDim Preserve t(UBound(t) + 1)
Next i
' Restitution de se tableau multidimension
ReDim Preserve t(UBound(t) - 1)
For i = LBound(t, 1) To UBound(t, 1)
Cells(i + 6, 9).Resize(UBound(t(i), 1), UBound(t(i), 2)) = t(i)
Next i
End Sub
La fonction de tri
VB:
Sub tri(a() As Variant, i, gauc...

patricktoulon

XLDnaute Barbatruc
ok mais toi tu fait pas attention a ce que je te dis

ton orientation est inutile!!!!! , caduque
la preuve teste sans
VB:
Sub tTest_Staple1600()
Application.ScreenUpdating = False
Tri_Horizontal_Staple1600 Range("c7:g32"), xlAscending
End Sub


Sub Tri_Horizontal_Staple1600(Plage As Range, Sens As XlSortOrder)
If Plage.Cells.Count = 1 Then Set Plage = Plage.CurrentRegion
For Each c In Plage.Rows
c.Sort Key1:=c.Cells(1, 1), Order1:=Sens, Header:=xlNo ', Orientation:=xlSortRows
Next c
End Sub
et c'est tout a fait normal il n'y a qu'une ligne (1 dim)
de toute façon c'est illogique d'employer cette constante dans ce contexte et j’appuie bien sur illogique

edit:
on c'est croisé laisse moi lire et analyser ta dernière démo
 

patricktoulon

XLDnaute Barbatruc
re
ben la ça l'est encore plus illogique alors
trier une plage d'une seule ligne par xlsortrows o_O o_O o_O o_O LOL
perso je met rien et tout ira bien dans ce contexte

D'autant plus que xlLeftToRight qui serait plus logique est inutile de la même façon que xlsortcolumns

donc selon moi le par defaut de doit pas être appliqué sinon il y aurait echec de sort en toute logique avec xlsortrows ou tout au moins rien faire ;)

a mon avis je pense plutôt que le (par défaut) doit être variant en fonction du nombre de colonne et/ ou de ligne
 

laurent950

XLDnaute Accro
Bonsoir, Patricktoulon, Staple1600
il faut juste faire un Tri d’un tableau (Array) à 1 dimension
Le coeur du programme est simple pour le reste c'est le principe du tri quickSort

VB:
Sub MiseEnForme()
Dim t() As Variant, i As Integer, j As Integer
ReDim t(1)
For i = 7 To ActiveSheet.Cells(ActiveSheet.Cells(65535, 3).End(xlUp).Row, 3).Row
    t(i - 6) = Range(Cells(i, 3), Cells(i, 7))
    tri t, i - 6, LBound(t(1), 2), UBound(t(1), 2)
    ReDim Preserve t(UBound(t) + 1)
Next i
' Restitution de se tableau multidimension
ReDim Preserve t(UBound(t) - 1)
For i = LBound(t, 1) To UBound(t, 1)
Cells(i + 6, 9).Resize(UBound(t(i), 1), UBound(t(i), 2)) = t(i)
Next i
End Sub
La fonction de tri
VB:
Sub tri(a() As Variant, i, gauc, droi) ' Quick sort
   ref = a(i)(1, (gauc + droi) \ 2)
   g = gauc: d = droi
   Do
     ' Pour un tri Croissant
      Do While a(i)(1, g) < ref: g = g + 1: Loop
      Do While ref < a(i)(1, d): d = d - 1: Loop
        If g <= d Then
           temp = a(i)(1, g): a(i)(1, g) = a(i)(1, d): a(i)(1, d) = temp
           g = g + 1: d = d - 1
        End If
    Loop While g <= d
    If g < droi Then Call tri(a, i, g, droi)
    If gauc < d Then Call tri(a, i, gauc, d)
End Sub

VB:
'Pour un tri décroissant
'Do While a(i)(g, colTri) > ref: g = g + 1: Loop
'Do While ref > a(i)(d, colTri): d = d - 1: Loop
 

Pièces jointes

  • QuickSortOrdreCroissantVariableTableau.xlsm
    23.8 KB · Affichages: 7
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re, Bonsoir laurent950

•>patricktoulon
Moi, je ne pense rien
Je lis juste ce qu'on trouve sur docs.microsoft.com
(cf quote dans le message#18)
Et je sais que
xlLeftToRight=2 et que (tiens, tiens) xlSortRows=2

Bref, 10 posts pour confirmer que le code du message#2 fonctionnait
(en lisant comment j'avais testé)
C'est pas grave, le temps perdu pendant le confinement, ça compte pas ;)

PS: Pourquoi tu n'es pas passé à Office 2019 directement ?
(Si tu le souhaites, réponse en MP plutôt que dans ce fil où d'ailleurs le demandeur n'est pas reparu)

•>laurent950
WTF :eek: ;)
Je plussoie à ce qu'a dit patricktoulon
Excel sait nativement trier horizontalement (avec Sort)
Donc utilisons-le non ? (sans sortir l'artillerie)
;)
 

Statistiques des forums

Discussions
312 165
Messages
2 085 884
Membres
103 017
dernier inscrit
pierre noyer