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
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
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
'---------------------------------------------
Évidemment, il faudrait remplacer cette ligne de code :
With Feuil1.Sort
Par
With Sh.Sort
pour être conséquent!
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
'---------------------------------------------------
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
Ca fonctionne Super. ;-)
Bonne soirée
Emile