Macro tri décroissant qui ne fonctionne pas ?
Bonjour à tous,
Je n'arrive pas à faire fonctionner une simple macro de tri décroissant.
Comme je débute en VBA, j'ai procédé simplement :
1- J'ai enregistré ma macro manuellement en réalisant le tri sur la plage voulue sur la base de la 2e colonne
2- J'ai remplacé le nom des cellules par les variables de ma macro qui renvoient à la plage voulue (le tri devant s'appliquer sur 3 tableaux (cf. image jointe) et ces tableaux ayant un nombre de lignes qui évolue selon les données à partir desquels ils sont générés, je ne peux mettre de plage de cellules fixe)
Lorsque je lance cette macro réalisée manuellement, cela fonctionne parfaitement :
'Macro tri décroissant réalisée manuellement
Range("B2:D8").Select
ActiveWorkbook.Worksheets("Complémentarité").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Complémentarité").Sort.SortFields.Add Key:=Range("B2"), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Complémentarité").Sort
.SetRange Range("B2:D8")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Mais la même macro avec les plages remplacées par mes variables ne fonctionne pas :
'Macro tri décroissant avec variables
For i = 1 to 3
Range(Cells(prem_ligne(i), 2), Cells(der_ligne(i) - 1, 4)).Select
ActiveWorkbook.Worksheets("Complémentarité").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Complémentarité").Sort.SortFields.Add Key:=Range(Cells(prem_ligne(i), 2)), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Complémentarité").Sort
.SetRange Range(Cells(prem_ligne(i), 2), Cells(der_ligne(i) - 1, 4))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Next i
En cherchant sur internet j'ai aussi trouvé ce code-là mais il ne fonctionne pas non plus quand je l'applique :
'Macro tri décroissant avec variables 2
Range(Cells(prem_ligne(i), 2), Cells(der_ligne(i) - 1, 4)).Select
Selection.Sort Key1:=2, SortOn:=xlSortOnValues, Order1:=xlDescending, Header:=xlYes, Orientation:=xlTopToBottom, DataOption:=xlSortNormal
Sachant que j'utilise ces variables pour d'autres actions sur la même plage et que ça fonctionne très bien, le problème ne vient donc surement pas de ces variables. Je suis bloqué là dessus depuis 1h, je ne comprends pas comment faire...
Pour info :
prem_ligne(i) correspond à la ligne des titres des colonnes (en gris foncé) pour chacun des 3 tableaux
der_ligne(i) correspond à la ligne "total" pour chacun des 3 tableaux (en rouge)
Je souhaite réaliser un tri sur les 3 colonnes gris clair à partir d'un tri décroissant de la colonne "nombre d'action".
Je vous remercie par avance.
Bonjour,
tu nous mets une photo, on répond avec une photo ?
indique pour chaque instruction cells, range, rows ou columns sur quelle feuille il faut la considérer.
Si après avoir fait cela, cela ne fonctionne pas et tu veux encore de l'aide, mets ton fichier anonymisé ou un fichier représentatif dans lequel tu as pu reproduire le problème. Cela nous évitera de chercher dans le vide.
Bonjour le fil, bonjour le forum,
On ne sait pas comment tu as défini tes variables de lignes !?... Ton problème vient peut-être de là...
Essaie comme ça :
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim LF As Integer 'déclare la variable LF (Ligne de Fin)
Dim I As Integer 'déclare la variable I (Incrément)
Dim Kp As Byte 'déclare la variable O (incrément première)
Dim Kd As Byte 'déclare la variable O (incrément dernière)
Dim PL(1 To 3) As Integer 'déclare le tableau de 3 variables PL (Première Ligne)
Dim DL(1 To 3) As Integer 'déclare le tableau de 3 variables DL (Dernière Ligne)
Set O = Worksheets("Complémentarité") 'définit l'onglet O
LF = O.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée LF de la colonne A de l'onglet O
Kp = 1: Kd = 1 'initialise les variables Kp et Kd
For I = 1 To LF 'boucle sur toutes les lignes I de 1 à LF
'si la cellule en colonne A de la boucle vaut "Employeur" définit la variable PL(Kp), incrémente Kp
If O.Cells(I, "A") = "Employeur" Then PL(Kp) = I: Kp = Kp + 1
'si la cellule en colonne A de la boucle vaut "Total" définit la variable DL(Kd), incrémente Kd
If O.Cells(I, "A") = "Total" Then DL(Kd) = I - 1: Kd = Kd + 1
Next I 'prochaine ligne de la boucle
For I = 1 To 3 'boucle sur les 3 tableaux
Range(Cells(PL(I), "B"), Cells(DL(I), "D")).Sort Key1:=Cells(DL(I), "B"), Order1:=xlDescending, Header:=xlYes 'tri
Next I 'prochain tableau de la boucle
End Sub
Merci ThauThème, je teste ta solution lundi quand je reprends au taf.
Si ça fonctionne pas j'essaierai d'anonymiser mon fichier comme le propose h2so4.
Bon weekend à vous
Bonjour,
Une proposition VBA.
Cdlt.
Public Sub SortTables()
Dim lo As ListObject
For Each lo In ActiveSheet.ListObjects
With lo
.Sort.SortFields.Add .ListColumns(2).DataBodyRange, xlSortOnValues, xlDescending
.Sort.Apply
.Sort.SortFields.Clear
End With
Next lo
End Sub
Bonjour à tous !
Finalement j'ai juste eu à déclarer les variables que j'avais "as integer" (elles étaient déclarées mais sans aucune précision)
et à utiliser cette simple formule "Range(Cells(PL(I), "B"), Cells(DL(I), "D")).Sort Key1:=Cells(DL(I), "B"), Order1:=xlDescending, Header:=xlYes" avec mes variables et ça fonctionne parfaitement !
Merci beaucoup à tous !