Tri de gauche à droite avec VBA

Fermé
aqpm - 25 avril 2009 à 15:42
 aqpm - 25 avril 2009 à 17:31
Bonjour,
Je dispose d'un tableau(10*10) contenant des valeurs entieres :
10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1

je voudrai à l'aide de macro, classer ces valeurs dans l'ordre croissant:
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

1 réponse

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
25 avril 2009 à 16:32
Bonjour

les valeurs peuvent être différentes dans les lignes (234, 567 123 ...); les doublons sont éliminés
Option Explicit

Sub trier_horizontal(lig As Byte)
Dim plage As Range, cellule As Range
Dim coll As Collection
Dim cptr As Byte, nbre As Byte
Dim alpha(), i As Byte, j As Byte, k As Byte, tmp As Byte, col As Byte

 
    Set plage = Range(Cells(lig, 1), Cells(lig, 10)) ' a adapter
    Set coll = New Collection
    
    'recherche les valeurs sans doublons
    For Each cellule In plage
        On Error Resume Next
        coll.Add cellule.Value, CStr(cellule.Value)
        On Error GoTo 0
    Next
    nbre = coll.Count

 '  restitue la plage épurée des doublons dans une variable tableau
    ReDim alpha(nbre)
    cptr = 1
    While cptr <= nbre
        alpha(cptr) = coll(cptr)
        cptr = cptr + 1
    Wend

     'Tri décroissant
    For i = 1 To nbre
            j = i
            For k = j + 1 To nbre
            '(pour un tri croissant ecrire <=)
            If alpha(k) >= alpha(j) Then j = k
            Next k
        If i <> j Then
            tmp = alpha(j)
            alpha(j) = alpha(i)
            alpha(i) = tmp
        End If
    Next i
    'restitution des valeurs en ordre décroissant
    Application.ScreenUpdating = False
    Rows(cptr).ClearContents
    col = 1
    While col <= nbre
        Cells(lig, col) = alpha(col)
        col = col + 1
    Wend
    Set plage = Nothing
    Set coll = Nothing
End Sub

Sub boucler()
Dim ligne As Byte
Application.ScreenUpdating = False
For ligne = 1 To 10
    trier_horizontal (ligne)
Next
End Sub

0
C'est exactement ça!! Merci beaucoup Michel!
0