Tri à la fermeture d'un fichier

Bonjour,

Encore une fois je pose mes questions. J'ai commencé les codes VBA il y a 2 mois et je trouve ça tellement pratique que je me renseigne au maximum pour faire des tableaux ultra pratique.

ma question aujourd'hui est quel est le code pour faire un tri automatique à la fermeture d'un fichier sur des feuilles protégées ?

j'ai essayer ce code, mais il ne fonction pas.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Sheets("ADM").Unprotect "2112"
'Sélectionner la/les feuille(s) à trier
Sheets("ADM").Select
'Définir à partir de quelle cellule trier
Cells.Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Sheets("ADM").Protect "2112", True, True, True
End Sub

J'ai placer ce code dans ThisWorkbook, dans la feuille concernée, dans un module et il ne se passe rien.

pourquoi ? de l'aide s'il vous plait.

Merci par avance

Bonjour,

Ce n'est pas forcément recommandable...

#1 - Il faut toujours réfléchir aux conséquences des macros automatiques !

Dans le classeur joint au moment de quitter, la feuille "ADM" est activée et retriée.

Il me semble inutile de retrier toutes les feuilles.

Il suffit de mettre les mêmes macros dans toutes les feuilles ou tu veux un tri automatique pour que les feuilles soit retriées au moment de leur sélection.

Cependant relire #1 !

A mon sens avoir un tri sur la première ligne est bien suffisant, le tri systématique à l'activation d'une feuille peut avoir plus d’inconvénients que d'avantages...

En effet les débutants en VBA sont friand en Select et Activate pour tout un tas de trucs, mais ils ne réfléchissent pas souvent aux conséquences...

A+

Bonjour,

Merci d'avoir pris le temps de me répondre mais je n'ai pas tout compris

Pourquoi n'est-il pas judicieux de retrier les feuilles à la fermeture du classeur ?

ce que je souhaite c'est qu'à l'ouverture du fichier toutes les feuilles soient trier par nom, je ne comprends pas où cela peut poser des problèmes...

vous remerciant par avance.

Bonjour,

Pour poster du code, vous pouvez utiliser les balises </> du ruban d'icônes, ça permet de le rendre plus lisible.

Ici, je pense qu'il ne se passe rien car il n'y a pas de sauvegarde du classeur ensuite.

Voici un essai :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Trier sheets("ADM"), range("A1"), "2112"
me.save '<<< sauvegarde après tri
End Sub

Sub Trier(Feuille as worksheet, Champ, mdp$)
with Feuille
    .Unprotect mdp
    .Cells.Sort Key1:=Champ, Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    .Protect mdp, True, True, True
end with
end sub

Cdlt,

Bah... Cette affirmation est le fruit de mon expérience personnelle libre à toi d'en tenir compte ou pas...
De toute façon je t'ai donné le moyen de trier une feuille : Il n'est pas bien compliqué d'adapter pour les trier toutes !
Il faut que je te le fasse ?

Merci Galopin pour ton retour. Tout avis est bon apprendre surtout qu'en on maîtrise pas

Je pense réussir à adapter le code pour les autres feuilles.

si je comprend bien tu me conseilles plutôt de créer un code qui à l'activation de la feuille retrie ma feuille par le nom que de le faire à la fermeture ou à l'ouverture du fichier, c'est bien ça ?

Bon,

Je vais quand même me lancer dans de longues explications : C'est pas forcément mieux d'avoir une macro automatique qui te re-trie systématiquement ta feuille comme tu veux pas. (le jour ou tu voudrais surtout pas que ça te le re-trie...)

Le problème c'est que, même si c'est déjà pas mal, (en tout cas moins pire que certains trucs qu'on voit passer...) ton truc est "très personnel", pas très normé.

Donc c'est un peux difficile avec un patchwork de faire quelque chose d'uni !

Donc il faudrait faire une macro unique qui ferait tout séparément c'est à dire trier tes feuilles aux petits oignons.

Bon pour trier des feuilles sans être embêté par les mots de passe c'est pas compliqué tu mets :

ActiveSheet.Protect Password:="2112", UserInterfaceOnly:=True

...Au début de ta macro : C'est pas sorcier ! Cette ligne indique que la protection des feuilles s'applique à l'utilisateur, mais pas à la macro. et après tu fais ce que tu veux. Pas besoin de unprotect, re protect... t'as que l'embarras du choix.

Sauf que tu as remarqué que la ligne commence par ActiveSheet...

Donc ça suppose que tu actives à chaque fois les feuilles pour lancer la procédure de Tri.

Particulièrement signalé : C'est d'ailleurs le même problème dans le classeur que je t'ai envoyé : Il faut modifier la macro :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Worksheets("ADM").Activate
Range("A1").Activate
End Sub

... pour éviter une erreur due à l'activation.

Donc dans cette macro _Before Close il faudrait activer toute ta ribambelle de feuilles) pour provoquer le tri de chacune d'elle.

A supposer que chacune possède la procédure de tri ad-hoc. Ça c'est pas bien compliqué : pisser des km de VBA pour faire n'importe quoi tout le monde sait faire...

Cependant tu n'auras pas plus de certitude que c'est réellement indispensable et que ce tri d'office ne sera jamais un problème.

Bon. Ceci dit : Tu pourrais aussi te dire Galopin "y me les brises" avec son activation je veux juste un tri avant fermeture.

C'est effectivement possible tu vas alors avoir une longue procédure du type :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
With Worksheets("ADM")
.Protect Password:="2112", UserInterfaceOnly:=True
    .Range("ADM").Sort key1:=.Range("A1"), order1:=xlAscending, Header:=xlYes, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
End With
With Worksheets("Suivi Dossiers")
.Protect Password:="2112", UserInterfaceOnly:=True
    .Range("Suivi_Dossiers").Sort key1:=.Range("A1"), order1:=xlAscending, Header:=xlYes, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
End With
'... et ainsi de suite jusqu'à la dernière
End Sub

Mais cette longue procédure ne servira qu'à ça. et tu perdras le bénéfice d'avoir un "tri à la demande" sur la première ligne. Tu vas dire ça tombe bien ça m'arrange parce que moi j'ai mis des liens hypertextes sur mes premières lignes... Mais là encore, c'est juste parce que toi tu utilises des trucs bien à toi...

Bon j'arrête là... après tout tu fais comme tu veux : Tu as toutes les cartes en mains avec cette dernière macro, ça te permet de supprimer toutes les macros d'activation de feuille et de faire comme bon te semble !

Il serait possible de considérablement réduire le code si toutes tes feuilles était bâties sur un même principe générique : Worksheets.("ADM") = Range("ADM") ; Mais ce n'est pas le cas à cause de ce "_" du à un manque d'expérience dans le nommage des choses... (De plus le nom n'est pas identique). Je n'ai pas regardé les autres feuilles) Mais ça seule une longue expérience pourra éventuellement t'en apporter le bénéfice.

OK ?

C'est super je te remercie infiniment pour ton retour et le temps que tu as pris à m'expliquer tout ça. effectivement je débute, je n'ai commencé qu'il a 2 mois donc je suis beaucoup sur le forum pour trouver des solutions à tout ce que je ne sais pas faire et que j'aimerais faire sur mes tableaux.

je prend note du code pour éviter de déprotéger et reprotéger ma feuille à chaque macro (ça me fera une ligne de code en moins sur mes macros ^^ et je pourrais le faire pour mes autres tableaux).

je pense que je vais opter pour l'option du tri quand j'active la feuille, c'est le plus simple.

encore mille fois merci pour tes explications et ton temps

En fait cette ligne n'est pas "forcément indispensable" ! Cependant quand on débute elle à tendance à le devenir...

En effet, "en temps normal" il suffit de lancer cette routine une seule fois pour chaque feuille (à l'ouverture du classeur habituellement) et ça devrait suffire pour toute la session de travail... VBA mémorise et par la suite les macros devraient pssser sans problème.

Le problème c'est que cette instruction est "Volatile" Ce qui signifie qu'en cas d'erreur d'exécution (dont sont friands les débutants...), VBA à tendance à "oublier" cette instruction. Donc quand on débute il vaut mieux lui rappeler plus souvent que nécessaire si on ne veut pas être embêté de ce coté là.

Mébon pour éviter de répéter toujours cette ligne, et de galvauder mon mot de passe un peu partout, tu peux faire un sub protVBA dans Module1 et appeler cette sub de temps en temps ...

Sub ProtVBA()
ActiveSheet.Protect Password:="2112", UserInterfaceOnly:=True
End Sub

A+

Merci pour ce complément

De rien. N'hésite pas revenir si tu as des difficultés à finaliser après ton choix définitif. Bon tu vas avoir un soucis avec tes liens hypertext...

Si tu décides de conserver le tri sur activation de feuille (ou/et) sur clic dans une colonne, n'hésite pas à supprimer les liens hypertext sur la première ligne :

Il me semble préférable de doubler la hauteur de la première ligne, quitte à rajouter un bouton (lien) vers une autre feuille. Dans ce contexte ça me semble préférable à tes liens hypertexte.

Toutefois TOUSSA n'est pas obligatoire... Tu peux aussi décider de maintenir tes liens hypertextes et maintenir un tri sur cette ligne en jouant habilement sur le clic gauche et le clic droit... Mébon, là encore c'est une question de feeling et d'expérience : Les liens hypertext, c'est pas mon truc mais si toi ça te branche...

A+

J'ai finalement supprimer les liens hypertextes, c'est plus simple.

Merci.

Rechercher des sujets similaires à "tri fermeture fichier"