Bonjour Edouard,
As tu bien dormi ? .....
Les macro de tri et de copie peuvent être fondues en une seule ou bien être indépendante.
Dans les deux cas, il vaut mieux faire la copie après le tri.
Maintenant, quelques commentaires :
'***Déclaration de la macro (ça, ça va)
Sub CopieLesFormules()
'***Sélection de la plage à recopier. C'est la plage où on sait qu'il y a des formules en bon état. Cette plage ne bouge pas lors du tri.
Range("E5:AZ5").Select
'***Instruction Copier
Selection.Copy
'***Sélection de la cible. Là où on veut recopier les informations. La plage est petite, c'est pour l'exemple.
Range("E6:E9").Select
'***Instruction Collage spécial. On lui dit qu'on recopie tout (on aurait pu limiter aux formules) sauf les blancs. L'effet est une recopie des formules uniquement avec une incrémentation correcte de numéros de ligne.
Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, skipBlanks:=True, Transpose:=False
'***Fin de la procédure
End Sub
Pour sélectionner ta cible, tu as deux solutions dans la macro :
1 - La cible a toujours la même taille.
On s'embête pas, on code directement, par exemple : Range ("E6:E350")
2 - La cible n'a pas toujours la même taille.
Pour éviter de faire une recopie qui dépasse du tableau (et oui, pour se couvrir on peut être tenté de recopier jusqu'à la ligne 1000 que l'on sait hors d'atteinte), on va chercher la dernière ligne utilisée dans ce tableau et recopier les formules uniquement jusque là. Cela se traduit par :
'***Recherche de la dernière ligne utilisée. "dl" est une variable dont j'ai choisi le nom de manière complètement arbitraire. Il faut juste éviter les mots réservés d'Excel. Mais ça, il te le signale. Ici "dl" pour Dernière Ligne. le fonctionnement de cette instruction est le suivant : je sélectionne la dernière cellule en bas de la colonne B, puis je remonte jusqu'à ce que je trouve quelque chose. Je considère que c'est le bas de mon tableau.
dl = Sheets("Zone SO").Range("b65536").End(xlUp).Row
'***Sélection de la zone cible E6 à E dernière ligne utilisée.
Range("E6:E" & dl).Select
Ces deux lignes sont à mettre à la place de Range ("E6:E9")
A propos des décalages, ils se produisent à chaque fois que tu as une formule qui contient une adresse de feuille style "Feuille3!E6". Le E6 ne suit pas lors du tri.
Copie le code suivant dans un module et fait une exécution pas à pas (touche F8).
Sub TriEtRecopieDesFormules()
'
' Macro2 Macro
' Macro enregistrée le 22/07/2004 par UC2139
'
derl = Sheets("Zone SO").Range("b65536").End(xlUp).Row
Range("E6:AZ" & derl).Select
Selection.Copy
Range("E6").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
MsgBox ("Tri sur la colonne AP")
Range("A6:AZ" & derl).Select
Selection.Sort Key1:=Range("AP6"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
reponse = MsgBox("Voulez vous trier sur la colonne AZ ?", vbYesNo)
If reponse = 6 Then Selection.Sort Key1:=Range("AP6"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Range("E5:az5").Select
Selection.Copy
Range("E6:E" & derl).Select
Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=True _
, Transpose:=False
End Sub
A+
Abel