Trier plus de 3 colonnes
Bonjour tout le monde,
J'ai une demande assez spéciale car j'aimerais vraiment comprendre un code et surtout voir si il était possible de le simplifier, j'ai utilisé l'enregistreur de macro et voilà ce que j'ai obtenu :
Sub Macro1()
Columns("A:K").Select
ActiveWorkbook.Worksheets("Modele").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Modele").Sort.SortFields.Add2 Key:=Range("A2:A853" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Modele").Sort.SortFields.Add2 Key:=Range("B2:B853" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Modele").Sort.SortFields.Add2 Key:=Range("C2:C853" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Modele").Sort.SortFields.Add2 Key:=Range("D2:D853" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Modele").Sort.SortFields.Add2 Key:=Range("E2:E853" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Modele").Sort.SortFields.Add2 Key:=Range("F2:F853" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Modele").Sort
.SetRange Range("A1:K853")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End SubJe pense comprendre la majeur partie du code, mais je me demande si des éléments ne peuvent pas être supprimés.
Exemple :
ActiveWorkbook.Worksheets("Modele").Sort.SortFields.Clear
Et
SortOn:=xlSortOnValues
Et
DataOption:=xlSortNormalOu encore :
With ActiveWorkbook.Worksheets("Modele").Sort
.SetRange Range("A1:K853")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End WithEt j'aimerais savoir si je pouvais simplifier les parties :
ActiveWorkbook.Worksheets("Modele").Sort.SortFields.Add2 Key:=Range("A2:A853" _
)En sachant qu'au lieu de A853 ou B853 ou C853 ... j'aimerais avoir jusque la dernière ligne au final.
J'ai testé pleins de codes trouvés sur le web sans forcément le comprendre et surtout au final aucun ne répond à mon besoin, comme j'ai plus de trois colonnes un code dans le style :
Sub tri()
Range("A1").CurrentRegion.Sort key1:=Range("A1"), order1:=xlAscending, dataoption1:=xlSortNormal, _
key2:=Range("C1"), order2:=xlAscending, dataoption2:=xlSortNormal, Header:=xlYes
End SubNe fonctionne pas ...
J'en appel donc à vous savoir déjà comment fonctionne le code et si je pouvais le simplifier et l'étendre à toutes les lignes et non pas le limiter à la cellule 853
Merci d'avance à vous et bonne soirée !
Cordialement,
Bonsoir Kinders59
Voici le code optimisé en utilisant les objets conteneurs "With XXX"
Sub Macro1()
Dim dLig As Long
' Avec la feuille de classeur actif
With ActiveWorkbook.Worksheets("Modele")
'Dernière ligne remplie de la colonne A
dLig = .Range("A" & Rows.Count).End(xlUp).Row
' Effacer le tri
.Sort.SortFields.Clear
' Avec l'objet Tri
With .Sort
' Ajouter un champ de tri
.SortFields.Add2 Key:=Range("A2:A" & dLig), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add2 Key:=Range("B2:B" & dLig), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add2 Key:=Range("C2:C" & dLig), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add2 Key:=Range("D2:D" & dLig), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add2 Key:=Range("E2:E" & dLig), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add2 Key:=Range("F2:F" & dLig), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
' Définir la zone de tri et les paramètres
.SetRange Range("A1:K" & dLig)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
End SubLe "DataOption:=xlSortNormal" permet de spécifier à Excel de trier normalement, ceci dit c'est une option non obligatoire
J'espère que ce sera plus clair pour vous
A+
Bonjour à tous,
Une petite contribution.
Il faudrait penser à mettre les données sous forme de tableau (structuré).
Cdlt.
Public Sub SortData()
Dim wsData As Worksheet, rngData As Range
Set wsData = Worksheets("Modele")
Set rngData = wsData.Cells(1).CurrentRegion
With wsData.Sort
.SortFields.Add Key:=rngData(1, 1), Order:=xlAscending
.SortFields.Add Key:=rngData(1, 2), Order:=xlAscending
.SortFields.Add Key:=rngData(1, 3), Order:=xlAscending
.SortFields.Add Key:=rngData(1, 4), Order:=xlAscending
.SortFields.Add Key:=rngData(1, 5), Order:=xlAscending
.SortFields.Add Key:=rngData(1, 6), Order:=xlAscending
.SetRange rngData
.Header = xlYes
.Apply
.SortFields.Clear
End With
End SubBonjour à vous deux,
Merci beaucoup pour vos réponses, je vais tester tout ça (merci @BrunoM45 pour les explications dans le code
@Jean-Eric, mettre les données sous forme de tableau c'est à dire ? Devoir transformer mes colonnes en tableau c'est ça ? Qu'est-ce que cela apporterait de plus concrètement ? Du coup, le code envoyé de votre côté est fait pour un tableau ?
Merci à vous en tout cas pour ces réponses très rapide !
Bonjour,
Depuis plus de 15 ans, on doit privilégier l'usage des tableaux (structurés).
Il y a beaucoup d'avantages (et peu d'inconvénients) à utiliser ces tableaux.
La procédure avec un tableau structuré est un peu différente :
Public Sub SortData_2()
Dim wsData As Worksheet, rngData As Range
Set wsData = Worksheets("Sheet2")
Set rngData = wsData.Range("Table1")
With rngData.ListObject.Sort
.SortFields.Add Key:=rngData(0, 1), Order:=xlAscending
.SortFields.Add Key:=rngData(0, 2), Order:=xlAscending
.SortFields.Add Key:=rngData(0, 3), Order:=xlAscending
.SortFields.Add Key:=rngData(0, 4), Order:=xlAscending
.SortFields.Add Key:=rngData(0, 5), Order:=xlAscending
.SortFields.Add Key:=rngData(0, 6), Order:=xlAscending
.Header = xlYes
.Apply
.SortFields.Clear
End With
End Sub
Bonjour Jean-Eric, j'avoue ne pas trop savoir pourquoi je ne suis pas passé par un tableau pourtant je connais mais ça ne me paraissait pas forcément utile et surtout j'ignorais les avantages d'un tel tableau.
Je dois avouer que maintenant que mon fichier de base fait à peu près 10 onglets et qu'il y a déjà pas mal de formule et VBA j'ai peur de devoir investir beaucoup de temps à tout refaire sous forme de tableau et donc revoir toutes mes formules et code VBA
En tout cas encore merci, si je vois que le temps me le permet je verrais très certainement pour refaire mes codes et formules en intégrant des tableaux, mais j'ai peur de me lancer dans quelque chose que je ne maitriserais pas ...
Re,
Tu sais ou trouver de l'aide pour tes prochaines questions..
Cdlt.