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.
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 :
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