Trier un planning
Bonjour à tous,
je demande votre aide car je m'en sors habituellement avec les macros en utilisant la technique d'enregistrement de macro, mais ce soir, Excel m'a dit que j'étais allé trop loin, avec trop d'opérations.
J'ai le planning en PJ, et je souhaite faire trier excel, sur une zone définie (exemple : "zonedetri") auparavant, en triant les colonnes de droite à gauche, les unes après les autres, et de A à Z. Ainsi, sur mon planning, à la fin de ce tri, la première ligne sera la première à réaliser (tel que sur la photo).
Avez-vous une idée de code pour cela ?
Merci d'avance
Bonjour,
En supposant que votre tableau est nommé "zonedetri", il y a peut-être la possibilité (je ne sais pas et je n'ai pas essayé) de remplacer vos lignes :
ActiveWorkbook.Worksheets("Votreonglet").Sort.SortFields.Add Key:=Range("XXX"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Votreonglet").Sort.SortFields.Add Key:=Range("YYY"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
par
'avec K = range("zonedetri").columns.count 'nombre colonnes de "zonedetri"
with ActiveWorkbook.ListObjects("zonedetri").Sort 'ou ActiveWorkbook.range("zonedetri").Sort ?
for k = K to x step -1 'tri sur colonne de droite à gauche, de K la dernière à x, celle où on arrête.
.SortFields.Add Key:=Range("zonedetri").columns(k), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'tri classique
next
.SetRange Range("zonedetri") 'ou Listobjects("zonedetri")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.Apply
End WithJe ne suis pas sûr d'avoir bien saisi votre besoin donc ce code ne correspondra peut-être pas...
Cordialement,
Bonjour, et merci pour votre réponse.
J'ai pris le temps de tester votre proposition, en adaptant les noms des zones, ... mais en vain.
Je pense avoir mal exprimé mon besoin :
Sur le print ecran joint, je souhaite trier colonne Z de A à Z, puis colonne Y de A à Z, ... et la dernière colonne F de A à Z, avec les outils de tri en place. Auparavant, j'airai sélectionné la à trier et je l'aurai intitulée ZoneDeTri.
A mon avis de novice, il faut lui faire faire une boucle, où la première serait la Z, la seconde la Y, ....jusqu'à F. Et c'est ce tri en boucle que je n'arrive pas à faire.
Merci de vous interesser à mon problème.
Bonne journée
Bonsoir,
Avez vous votre fichier ou équivalent à fournir ? Comme cela un plus grand nombre d'intervenant pourra intervenir... Vous savez c'est une des règles (je crois que c'est la 6) du forum...
De mon coté, je n'avais pas bien compris le truc, mais maintenant je pense avoir compris :
il faut mettre en tête du tableau la ou les lignes qui ont un "X" le plus à gauche du tableau, et ainsi de suite afin de les mettre dans l'ordre verticale des opérations les plus proche à venir. Est-ce bien cela ?
@ bientôt
LouReeD
Bonjour,
Oui, c'est exactement ce que dit mon code. Peut-être que la syntaxe n'y est pas, mais sur le principe, de 26 à 6 en -1, on ajoute une clé de tri ascendant.
Je vous conseille de faire un tri sur 2 colonnes avec l'enregistreur de macro. Ensuite vous ciblez la partie concernée et vous l'adaptez de manière à obtenir dans votre boucle :
with ActiveWorkbook.ListObjects("zonedetri").Sort 'ou ActiveWorkbook.range("zonedetri").Sort ?
for k = K to x step -1 'tri sur colonne de droite à gauche, de K la dernière à x, celle où on arrête.
.SortFields.Add Key:=Range("zonedetri").columns(k), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'tri classique
next
OU
with ActiveWorkbook.ListObjects("zonedetri").Sort.SortFields
for k = K to x step -1 'tri sur colonne de droite à gauche, de K la dernière à x, celle où on arrête.
.Add Key:=Range("zonedetri").columns(k), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'tri classique
nextC'est quelque chose comme ça, mais de tête, je ne saurais vous apporter la syntaxe exacte.
Concentrez-vous sur la ligne dans la boucle et sur l'objet (entre listobjects() et range()).
Cordialement,
Bonsoir
vous avez parfaitement résumé. Et
pour cela, je pensais qu'un tri en partant de la droite serait le plus efficace.
merci encore,
Nicolas
for k = 26 to 6 step -1C'est cette ligne boucle sur les colonnes de droite à gauche (de 26 à 6)
Il bug à cet endroit. J'ai du mal à comprendre pourquoi...
Sub test1()
'
' test1 Macro
'
With ActiveWorkbook.ListObjects("zonedetri").Sort.SortFields
For k = k To x Step -1 'tri sur colonne de droite à gauche, de K la dernière à x, celle où on arrête.
.Add Key:=Range("zonedetri").Columns(k), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 'tri classique
Next
End With
End Sub
Alors, j'ai saisi "zonedetri" pour que vous ayez un exemple à exploiter mais je pense qu'il vous faut remplacer par le nom de votre tableau à vous, ou que vous en nommiez un si ce n'est pas déjà le cas.
Ici, s'il ne bugge pas, le code ne vous donnera rien car tant que la ligne .Apply n'a pas été atteinte, rien ne se passe.
Je vous suggère donc de faire un essai avec l'enregistreur pour avoir la syntaxe exacte et ainsi de l'adapter avec vos noms à vous.
Et si cette ligne bloque encore, essayez de l'adapter ActiveWorkbook.Activesheet.ListObjects("zonedetri").Sort.SortFields
ou ActiveWorkbook.Range("zonedetri").Sort.SortFields, PAR EXEMPLE...
Bon courage,
Bonsoir,
j'ai fini par m'en sortir sans trop comprendre ce que j'écrivais, mais en mélangeant vos conseil, et le fruit de différents enrgistrements de macro.
Je pense que c'est comme ça qu'on apprend
merci
Bonsoir,
Et bien, c'est super ! J'espère que vous avez obtenu le résultat que vous attendiez...
Désolé de ne pas avoir été plus précis mais je ne suis pas un expert en la matière, je comprends les principes mais je ne maitrise pas toute la syntaxe. Et j'ai considéré que le problème résidait essentiellement dans la boucle. Mais si vous voulez, je peux essayer de vous expliquer les parties que vous ne comprenez pas.
Pourriez-vous poster le code final ? Ça pourrait en intéresser certains (et moi y compris). Merci d'avance,
Cordialement,
Bonjour,
voici le code que j'ai fini. Il me reste un point à améliorer :
J'ai décrit un nom dans le gestionnaire de noms pour définir une zone (qui ici s'appelle TRIORGANISATION), mais malgré ça, je dois indiquer dans le code mon numéro de colonne de début et mon numéro de colonne de fin. J'aurais aimé que le fait de définir une zone suffise.
Sub Triorga()'' Triorga Macro'With ActiveWorkbook.Worksheets("Planning Organisation").AutoFilter.Sort.SortFields.ClearFor k = 61 To 1 Step -1 'tri sur colonne de droite à gauche, de K la dernière à x, celle où on arrête.ActiveWorkbook.Worksheets("Planning Organisation").AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets("Planning Organisation").AutoFilter.Sort.SortFields.Add2 _Key:=Range("TRIORGANISATION").Columns(k), SortOn:=xlSortOnValues, Order:=xlAscending, _ DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Planning Organisation").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End WithNextEnd WithEnd Sub
Merci encore
Bonjour,
Merci pour le code !
Sub Triorga()
Dim NbColTri%, ColFin%, ColDeb%
NbCol = Range("TRIORGANISATION").columns.count
ColDeb = Range("TRIORGANISATION").column
ColFin = ColDeb + NbCol - 1
With ActiveWorkbook.Worksheets("Planning Organisation").AutoFilter.Sort
.SortFields.Clear
For k = ColFin To ColDeb Step -1
.SortFields.Add Key:=Range("TRIORGANISATION").Columns(k), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
next k
.SetRange Range("TRIORGANISATION")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End SubEst-ce que tu peux essayer ce code avec les colonnes variables (ici, tri sur toutes les colonnes de la plage TRIORGANISATION).
J'ai essayé de réarranger la syntaxe mais si jamais ça ne fonctionnait pas, il faudrait probablement repartir de la tienne.
Bonne journée,
Bonjour,
je pense qu'on y est presque.
Avec le code ci dessous, je crois comprendre que tu fais chercher le nombre de colonnes dans la zone. C'est cette partie recherche qui ne fonctionne pas très bien.
Car dans la partie For k = ColFin To ColDeb Step -1 si je remplace Colfin et Coldeb par des valeurs (12 et 6 par exemple), ça marche. Mais si je les laisse, ca bug sur le apply beaucoup plus bas.
Dim NbColTri%, ColFin%, ColDeb%
NbColTri = Range("TRIORGANISATION").Columns.Count
ColDeb = Range("TRIORGANISATION").Column
ColFin = ColDeb + NbColTri - 1
With ActiveWorkbook.Worksheets("Planning Organisation").AutoFilter.Sort.SortFields.Clear
For k = ColFin To ColDeb Step -1 'tri sur colonne de droite à gauche, de K la dernière à x, celle où on arrête.
ActiveWorkbook.Worksheets("Planning Organisation").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Planning Organisation").AutoFilter.Sort.SortFields.Add2 _
Key:=Range("TRIORGANISATION").Columns(k), SortOn:=xlSortOnValues, Order:=xlAscending, _
DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Planning Organisation").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Next
End WithMerci d'avance