Macro de tri (diff. entre XL 2003 et 2007)

Le
Emile63
Bonjour à tous,

J'ai une macro (issue d'une feuille faite avec XL 2003) qui trie automatiqu=
ement des donnés sur 3 critères et qui fonctionne bien:
-
Feuil2.[D15].Select
Selection.CurrentRegion.Select
Selection.Sort _
Key1:=Range("L16"), Order1:=xlAscending, _
Key2:=Range("K16"), Order2:=xlAscending, _
Key3:=Range("I16"), Order3:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=
=xlTopToBottom, _
DataOption1:=xlSortTextAsNumbers, _
DataOption2:=xlSortNormal, _
DataOption3:=xlSortNormal

-
Aujourd'hui, avec XL 2007, je souhaiterais trier sur 5 critères, mais je =
trouve que l'enregistreur de macros me "pond" une procédure plutôt comp=
liquée et qui ne fonctionne pas à tous les coups.
Par quel moyen est-ce que je peux simplifier au mieux et gagner en efficaci=
té?
Car dans le second exemple les zones sont figés (ex:Range("L16:L25")) alo=
rs que précédemment, il triait a partir de l'entête de colonne quelle=
que soit le NB de lignes (puisque mon bulletin de livraison change constam=
ment)
-

ActiveWorkbook.Worksheets("Bulletin de livraison").Sort.SortFields.Clea=
r
ActiveWorkbook.Worksheets("Bulletin de livraison").Sort.SortFields.Add =
Key:= _
Range("L16:L25"), SortOn:=xlSortOnValues, Order:=xlAscending, D=
ataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Bulletin de livraison").Sort.SortFields.Add =
Key:= _
Range("K16:K25"), SortOn:=xlSortOnValues, Order:=xlAscending, D=
ataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Bulletin de livraison").Sort.SortFields.Add =
Key:= _
Range("I16:I25"), SortOn:=xlSortOnValues, Order:=xlAscending, D=
ataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Bulletin de livraison").Sort.SortFields.Add =
Key:= _
Range("E16:E25"), SortOn:=xlSortOnValues, Order:=xlAscending, D=
ataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Bulletin de livraison").Sort.SortFields.Add =
Key:= _
Range("D16:D25"), SortOn:=xlSortOnValues, Order:=xlAscending, D=
ataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Bulletin de livraison").Sort
.SetRange Range("C15:L25")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
-
Je vous remercie d'avance pour vos conseils et suggestions.
cordialement,

Emile
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
MichD
Le #26064402
Bonjour,

Tu dis que ce type de code ne fonctionne pas. Est-cela?

Dans la procédure, remplace "ThisWorkbook.Name" dans With
Workbooks(ThisWorkbook.Name)
par le nom du classeur + sont extension si la macro n'est pas mise dans le
classeur dont la feuille doit être triée.

'---------------------------------------------
Sub test()
Dim Sh As Worksheet

With Workbooks(ThisWorkbook.Name)
Set Sh = .Worksheets("Bulletin de livraison")
With Feuil1.Sort
.SortFields.Clear
.SetRange Sh.Range("C15:L25")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom

.SortFields.Add Key:=Sh.Range("L16"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Sh.Range("K16"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Sh.Range("i16"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Sh.Range("E16"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Sh.Range("D16"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.Apply
End With
End With
End Sub
'---------------------------------------------
MichD
Le #26064432
Oups, un oubli!!!

Évidemment, il faudrait remplacer cette ligne de code :

With Feuil1.Sort

Par

With Sh.Sort

pour être conséquent!
Emile63
Le #26064532
Une fois encore MichD, c'est la classe :-)
Merci.

Mais comme les données a trier sur mon bulletin peuvent être +/- nombre uses,
Est-ce que la ligne: .SetRange Sh.Range("C15:L25")
ne va pas me créer de problèmes si je dépasse le L25?
Ou est-ce qu'il faudrait préalablement compter les enregistrements pour l ui indiquer la "fin" de la sélection "Range"?
Merci pour ton éclairage sur ce point.
cordialement,
Emile
MichD
Le #26064592
Comme ceci :

'---------------------------------------------------
Sub test()
Dim Sh As Worksheet, DerLig As Long

With Workbooks(ThisWorkbook.Name)
Set Sh = .Worksheets("Bulletin de livraison")
End With

With Sh
With .Range("C:L")
DerLig = .Find("*", LookIn:=xlValues, SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
If DerLig < 16 Then DerLig = 16
End With

With .Sort
.SortFields.Clear
.SetRange Sh.Range("C15:L" & DerLig)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom

.SortFields.Add Key:=Sh.Range("L16"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Sh.Range("K16"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Sh.Range("i16"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Sh.Range("E16"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Sh.Range("D16"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.Apply
End With
End With

End Sub
'---------------------------------------------------

"Emile63" a écrit dans le message de groupe de discussion :


Une fois encore MichD, c'est la classe :-)
Merci.

Mais comme les données a trier sur mon bulletin peuvent être +/- nombreuses,
Est-ce que la ligne: .SetRange Sh.Range("C15:L25")
ne va pas me créer de problèmes si je dépasse le L25?
Ou est-ce qu'il faudrait préalablement compter les enregistrements pour lui
indiquer la "fin" de la sélection "Range"?
Merci pour ton éclairage sur ce point.
cordialement,
Emile
Emile63
Le #26064722
Merci MichD,

Ca fonctionne Super. ;-)
Bonne soirée
Emile
Publicité
Poster une réponse
Anonyme