Tri

Bonjour à Toutes et Tous,

Besoin d'un coup de main, qq peut-il me donner la solution afin de trier les lignes "total" coloriées

du plus grand nombre au plus petit (tout en conservant la mise en forme du tableau) et donc les lignes

liées au total.

Merci de votre retour.

6sport.xlsx (15.75 Ko)

Bonjour,

L'organisation de tes données ne favorise pas du tout ta demande...

Voilà une proposition, mais ça reste un peu du bricolage à mon goût :

4sport.xlsx (17.59 Ko)

Bonjour,

Le soucis c'est la façon dont tu as généré ce tableau, il faudrait que tu fasses autrement...

J'ai remis tes données dans une feuille base de données, puis j'en ai fait un tableau croisé dynamique, j'ai gardé ta présentation, puis j'ai fait un clic droit sur une cellule dans la colonne pourcentage qui se trouve sur une ligne sous total, et j'ai choisis trier du plus grand au plus petit, le résultat obtenu est le suivant:

Pour le pourcentage j'ai ajouté un champ calculé.

Voir la feuille TCD pour le résultat.

Bonjour,

Une piste en conservant ta mise en forme (voir commentaires pour compréhension du code) :

Sub Test()

    Dim Plage As Range
    Dim Cel As Range
    Dim Trouve As Range
    Dim Tbl() As Range
    Dim Tempo As Range
    Dim T
    Dim Chaine As String
    Dim I As Long
    Dim J As Long
    Dim Lig As Long
    Dim Pos As Integer

    With Worksheets("Feuil1")

        'défini la plage sur la colonne A de la feuille "Feuil1"
        Set Plage = .Range(.Cells(5, 1), .Cells(.Rows.Count, 1).End(xlUp))

        'parcours la plage...
        For Each Cel In Plage

            '...à la recherche du mot "Total" dans les cellules
            If InStr(Cel.Value, "Total") <> 0 Then

                'une fois trouvé, splite la en supprimant les espaces parasites (en fin de certaines chaines !)
                T = Split(Trim(Cel.Value), " ")

                'défini la chaine en fonction du nombre de mots...
                If UBound(T) = 2 Then
                    Chaine = Split(Cel.Value, " ")(1) & " " & Split(Cel.Value, " ")(2)
                Else
                    Chaine = Split(Cel.Value, " ")(1)
                End If

                '...puis recherche la chaine en partant du bas de la plage afin de trouver la chaine mais sans "Total"
                Set Trouve = Plage.Find(Chaine, Plage(Plage.Count), xlValues, xlWhole)

                'si pas trouvé, indique une erreur et fin car sinon, ça va rien donner de bon
                If Trouve Is Nothing Then MsgBox "Erreur !": Exit Sub

                'stocke la plage dans le tableau
                I = I + 1: ReDim Preserve Tbl(1 To I)
                Set Tbl(I) = Range(Trouve, Cel.Offset(, 4))

            End If

        Next Cel

        'effectue le tri décroissant du tableau
        For I = 1 To UBound(Tbl) - 1: For J = I + 1 To UBound(Tbl)

                If Tbl(I).Columns(Tbl(I).Columns.Count).Cells(Tbl(I).Rows.Count).Value < _
                    Tbl(J).Columns(Tbl(J).Columns.Count).Cells(Tbl(J).Rows.Count).Value Then

                    Set Tempo = Tbl(J): Set Tbl(J) = Tbl(I): Set Tbl(I) = Tempo

                End If

        Next J, I

        'mémorise la position de la dernière ligne pour plus tard
        Pos = .Cells(.Rows.Count, 1).End(xlUp).Row

        '.Range(.Cells(6, 1), .Cells(Rows.Count, 5)).Interior.ColorIndex = 0
        For I = 1 To UBound(Tbl)

            'position de la première ligne vide
            Lig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1

            'inscription des valeurs
            .Range(.Cells(Lig, 1), .Cells(Lig + Tbl(I).Rows.Count - 1, 5)).Value = Tbl(I).Value

            'parametrage des cellules
            .Range(.Cells(Lig, 1), .Cells(Lig, 4)).Interior.ColorIndex = 15
            .Range(.Cells(Lig, 1), .Cells(Lig, 4)).Font.Bold = True
            .Range(.Cells(Lig + Tbl(I).Rows.Count - 1, 1), .Cells(Lig + Tbl(I).Rows.Count - 1, 5)).Interior.ColorIndex = 40
            .Range(.Cells(Lig + Tbl(I).Rows.Count - 1, 1), .Cells(Lig + Tbl(I).Rows.Count - 1, 5)).Font.Bold = True

        Next I

        'formatage de la colonne E
        .Columns(5).NumberFormat = "0.00%"

        'suppression des anciennes valeurs
        .Range(.Cells(6, 1), .Cells(Pos, 5)).EntireRow.Delete

    End With

End Sub

Merci Pedro22, Ausecour, et Theze pour vos réponses, cela va m'aider pour les prochains tableaux

Je suis d'accord avec vous, sur comment est présenté le tableau et c'est bien là mon problème

cette présentation émane d'un tableau croisé dynamique d'où la difficulté de présentation par tri croissant ou décroissant.

Merci encore.

Merci Pedro22, Ausecour, et Theze pour vos réponses, cela va m'aider pour les prochains tableaux

Je suis d'accord avec vous, sur comment est présenté le tableau et c'est bien là mon problème

cette présentation émane d'un tableau croisé dynamique d'où la difficulté de présentation par tri croissant ou décroissant.

Merci encore.

Bonjour,

Si c'est un tableau croisé dynamique, alors fais simplement un clic droit sur la colonne pourcentage sur une ligne de total, et choisis trier du plus grand au plus petit, ça conservera ta mise en forme tout en triant tes données.

MERCI Ausecour , exactement ce qu'il me fallait, avec l'ajout du champ calculé c'est nickel

Bonne journée

Rechercher des sujets similaires à "tri"