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.

trivba

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.

15ziad.xlsm (20.96 Ko)
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 !

Rechercher des sujets similaires à "macro tri decroissant qui fonctionne pas"