Tri tri

E

Edouard

Guest
Bonsoir le forum

Tout content d’avoir terminer l’application ci –jointe et qui fonctionne ; Désastre quand je veux faire des tri de A à Z sur les totaux, notamment sur les colonnes AP et AZ.

Si quelqu’un peux m’expliquer pourquoi et comment y remédier je serais très content.
Merci
 

Pièces jointes

  • detectiontravail.zip
    48.5 KB · Affichages: 23
A

Abel

Guest
Bonjour Edouard, Ândré,

Le tri peut fonctionner (ça le fait sur ton exemple) à condition de sélectionner ta plage avant de demander le tri.

Tu te mets en A5, fais F8, puis ctrl+flèche droite, puis ctrl+flèche bas.
Pratique si tu as une grande zone à sélectionner.

Et enfin, tu demandes le tri sans demander la ligne de titre.

En espérant que cela te dépanne.

Abel.
 
E

Edouard

Guest
Bonsoir andré

OK pour ne pas sélectionner les cellules fusionnées; mais regarde le travail si tu selectionnes toutes les colonnes à partir de A5 et que tu demandes un tri croissant sur la colonne AZ.

ou AP cela change meme les résultats sur AP mais le plus spectaculaire est sur la colonne AZ.

à+
 
A

Abel

Guest
Bonjour Edouard,

Dans tes formules des colonnes S, U, AD, AF, etc, tu utilises une fonction EQUIV. Cette fonction fait référence à une cellule placée sur une ligne différente de celle où elle est placée.

Par exemple en AF5 on trouve ".....EQUIV('Zone SO'!E7;(T.Détente!$B$1:$S$1);1)+1))".

Cela ne devrait-il pas être "................EQUIV('Zone SO'!E5;(T.Détente!$B$1:$S$1);1)+1))" ?


C'est ce décalage qui provoque les changements de totaux puisque les valeurs à sommer changent.


Abel
 
A

Abel

Guest
Re,

En fait, il semble qu'Excel considère une adresse du type "AutreFeuille!A5" comme étant absolue dans certain cas comme le tri.

Je n'avais pas encore eu ce cas.

Lorsque l'on fait le tri sur ton tableau, tout se passe bien sauf .... dès qu'il y a une adresse comme ci-dessus, le changement de numéro de ligne ne se fait pas dans la formule, malgré l'absence de $.
Alors que cela fonctionne impec pour la recopie.

Y a t'il une option quelque part qui permette de faire suivre correctement ?


A+

Abel.
 
E

Edouard

Guest
Abel bonjour

Avec les moyens du bord je viens de faire la constatation suivante : après avoir sélectionné ma plage :A5 :AZ155 (en exploitation le tableau aura 150 lignes), je fais un copier, collage spécial, valeurs qui a pour but de supprimer toutes les formules et tous les tris deviennent possibles.
Par contre je n’ais pas la solution pour replacer les formules…Peux être une macro pourrait le faire … !

Reste un Pb pour la colonne AZ . Après le tri toutes les lignes se callent en fond de tableau.
Un zéro provisoire dans le test artistique (sur les lignes vierges) résout le Pb mais il faut le supprimer après le tri.

Une macro peut elle réaliser toutes ces fonctions cela devient compliqué…
À+
 
A

Abel

Guest
Edouard,

Effectivement, j'avais oublié de t'indiquer la solution du collage spécial.

Une autre solution qui passe aussi par le collage spécial et qui est un peu tirée par les cheveux :

Inserts une ligne vide en ligne 5. Dans cette ligne, place les formules corrigées (copier/coller formules et formats de la ligne 6 puis corrige les formules).

Fait le tri à partir de la ligne 6.

Sélectionnes de E5 à AZ5 et fait "Copier"

Sélectionnes de E6 à Ex et "Collage spécial" en sélectionnant "Blanc non compris".
Il te recopiera les formules sans écraser les valeurs entrées à la main.

Ces opérations peuvent se faire en VB.

Tu peux le faire en utilisant l'enregistreur.

Tu vas dans le menu "Outils/Macro.../Nouvelle macro", sélectionne "Dans ce classeur" si ça ne l'est pas.

Et répète les opérations ci-dessus à partir du tri.
Excel va traduire toutes tes opérations en lignes de code jusqu'à ce que tu cliques sur "Arrèter l'enregistrement".

Abel.
 
E

Edouard

Guest
Abel

Je peux plus te mettre de piece jointe car le fichier maintenant dépasse les 50 k

J’ai commencé la macro comme tu me l’as indiqué, mais le Pb est que cette feuille doit resservir et pour cela il faut pouvoir après avoir effectuer les tris, remettre en place les formules. ???

à +
 
A

Abel

Guest
Edouard,

Sub CopieLesFormules()

Range("E5:AZ5").Select
Selection.Copy
Range("E6:E9").Select
Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, skipBlanks:=True, Transpose:=False

End Sub

Fait une copie de ton fichier pour travailler sans pourir ton original.
Copie le code ci-dessus dans un module.
Auparavant, insert la ligne 5 du fichier que je te joints à la même place dans le fichier sur lequel tu travailles.
Modifie la ligne "Range ("E6:E9").Select" pour mettre la dernière ligne de ton tableau à la place du 9.

Il y a moyen de rechercher et récupérer automatiquement cette dernière ligne en faisant par exemple :

dl = Sheets("Zone SO").Range("b65536").End(xlUp).Row
Range("E6:E" & dl).Select

Abel
 
E

Edouard

Guest
Abel bonsoir

Si j’ai bien compris il faut q’a la macro » trirésultats »il faut que j’ajoute la commande :Selection….de ta macro copier les formules ; mais après je ne comprend plus.

Faire :dl=Sheets(« Zone SO ».Range(« b65536 »)…….. C’est une instruction complémentaire ?

Les deux fonctions trirésultats et copieformules vont – elles s’enchaîner ?
Pour avoir 50 K j’ai supprimé le tableau !

À+
 

Pièces jointes

  • Copiedecoupetravail.zip
    43.3 KB · Affichages: 21
A

Abel

Guest
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
 

Discussions similaires

Réponses
4
Affichages
642

Statistiques des forums

Discussions
312 488
Messages
2 088 867
Membres
103 979
dernier inscrit
imed