Bonjour,
peut-on obliger de passer par une macro pour ouvrir un classeur, c'est à dire empêcher qu'il ne s'ouvre directement.
Bonjour,
peut-on obliger de passer par une macro pour ouvrir un classeur, c'est à dire empêcher qu'il ne s'ouvre directement.
Salut,
Voici une proposition. elle est composée de 2 codes macros :
Un dans le fichier qui doit être ouvert par la macro (et que la macro)
Ce code est à placer dans le module "Thisworkbook". Il demande la fermeture du fichier ...
Le problème, c'est que maintenant, si tu veux ouvrir le fichier, a chaque fois, il se ferme ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub Workbook_Open() ActiveWorkbook.Close End Sub
Donc dans la macro qui ouvre le fichier, il faut momentanément désactiver les événements
Juste pour être complet, si tu veux, tout de même ouvrir le premier fichier sans passer par une macro (et oui, il y a toujours une solution mais il faut la connaître !!!)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Sub Macro1() ' ' Macro1 Macro ' Application.EnableEvents = False ' => désactive les événements 'ton code pour ouvri le fichier et faire ce que tu veux dedant Application.EnableEvents = True End Sub
Passe par la commande ouvrir et Maintient la touche "Shift" pendant l'ouverture. Cela à comme effet de déactiver les événements momentanément.
Bonjour
Tu peux toujours aller au plus simple --->> le protéger par un mot de passe et utiliser ce mot de passe dans l'instruction (ta macro) de son ouverture
Merci,
je comprends bien le principe, ok pour le code dans le classeur appelé qui ne doit être ouvert que par une macro
par contre pour
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub Workbook_Open() ActiveWorkbook.Close End Sub
je ne vois pas bien car il y a des liaisons entre les 2 fichiers, vont-elles être mises à jour automatiquement à l'ouverture du classeur ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part sub macro1
je vais tester
Il s'agit là d'une autre question, n'ayant rien à voir avec le fait que le fichier soit ouvrable ou non autrement que par macro.je ne vois pas bien car il y a des liaisons entre les 2 fichiers, vont-elles être mises à jour automatiquement à l'ouverture du classeur ?
Bonjour clementmarcotte
Et tous les autres (les espiègles ... et ils ne manquent pas) se dépêcheront d'ouvrir ce classeur, justement parce qu'il aura été protégé (ils voudront savoir pourquoi, du coupCeci dit, les solutions proposées devraient suffire pour les utilisateurs honnêtes et obéissants.).
![]()
Les plus vicieux :
- écriront dans le classeur concerné (celui à ne pas ouvrir autrement que par macro depuis un classeur d'appel) une instruction telle que si condition (par exemple présence d'un fichier texte créé et rempli depuis le classeur d'appel) non vérifiée -->> ouverture d'un classeur tiers totalement "bidon", ou de n'importe quoi (la calculette, un jeu quelconque, etc ... par exemple) puis fermeture du classeur.
- écriront depuis le classeur d'appel une instruction de création/remplissage du fichier texte que recherchera le classeur concerné (celui à ne pas ouvrir autrement)
Et ? -->> et ils trouveront toujours un encore plus vicieux qu'eux pour deviner qu'il y a là un mécanisme étrange, qu'il s'efforceront de découvrir, ne serait-ce que pour s'amuser. Et ils y parviendront
Bref -->> beaucoup de travail dans un but assez "questionnable".
Merci à tous, je prends note de vos conseils, j'ai implémenté la solution du post #2 et cela correspond bien à mon besoin
Salut.
Attention toutefois avec Application.EnableEvents.
Sans une gestion d'erreurs qui permet de restaurer la gestion des évènements, tu pourrais bloquer les évènements sur tous les fichiers ouverts, même ceux qui sont indépendants de ton "système". Ca pourrait énerver plus d'un utilisateur si ton fichier se plante.
Je ne saurais trop conseiller d'intégrer une gestion d'erreurs
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Sub Test() On Error GoTo EndHandler Application.EnableEvents = False ... ... ... EndHandler: Application.EnableEvents = True End Sub
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Quand j'ouvre mon fichier je fais ça :
Cela marche très bien mais tu me conseilles donc plûtot cela ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Application.EnableEvents = False Workbooks.Open ThisWorkbook.Path & "\fichier.xlsm" Application.EnableEvents = True
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 On Error GoTo EndHandler Application.EnableEvents = False ' si erreur on saute cette ligne Workbooks.Open ThisWorkbook.Path & "\fichier.xlsm" ' si erreur on n'ouvre pas EndHandler: Application.EnableEvents = True
Oui. imagine ce qui se passe si ton fichier ne peut s'ouvrir pour une raison ou une autre. Il y aura une erreur, tu stopperas le code et Application.EnableEvents restera à False.
Il faut toujours gérer les erreurs lorsque le code modifie une propriété d'application, de manière à remettre Excel dans l'état dans lequel ta macro l'a trouvé.
(Normalement, il faudrait toujours gérer les erreurs avec un On error... sur les évènements, qui sont en général les premiers appels de pile, de manière à ne pas entrer en débogage)
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Oui j'ai bien noté et bien compris,
merci je vais vérifié tout ça (je ne touche quand même pas les propriétés d'application à tout va !)
Bonjour,
je reprends cette discussion voulant "protéger" l'accès à certains classeurs
Dans un classeur "test" je fais uniquement :
j'ouvre en faisant "Ouvrir" et en maintenant enfoncée la touche "Shift", j'ai bien le message "test" mais jamais "ok"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Private Sub Workbook_Open() Msgbox "test" ActiveWorkbook.Close Exit Sub Msgbox "ok" End Sub
Le classeur se ferme toujours
Où est mon erreur ? je ne la vois pas d'après vos conseils..
Bonjour,
ça fait quoi à ton avis Exit Sub ?
Et à plus forte raison s'il est précédé de ActiveWorkbook.Close
Seul Chuck Norris arrive à voir Ok
eric
Bonjour,
oui mais bon sang mais c'est bien sur...
Partager