Forcer l'ouverture sur un feuille sans workbook_open

zorglubxp

XLDnaute Junior
Bonjour,

Voici mon petit problème du jour (ou plutôt du soir).
Je souhaite qu'à l'ouverture d'un classeur excel, s'affiche une feuille déterminée.

Il serait facile d'inscrire cette commande dans l’événement workbook_open, mais ce serait trop simple car sans compter sur mon esprit tortueux.

Pour que les éventuels sauveurs puissent comprendre le pourquoi de ma requête, je vais tenter d'en expliquer la raison.
Le fichier que j'utilise est destiné à être utilisé par plusieurs personnes. Comme mon fichier utilise beaucoup de macros, j'ai besoin que les options de sécurités soient désactivées.
Bien que j'ai déjà envoyé la procédure à tous mes collègues, je sais que la majeure partie ne l'aura pas appliqué.

Ainsi, j'ai eu l'idée de les "forcer" à le faire lorsqu'ils auront ouvert le fichier. J'entends par forcer, afficher un message les invitant à appliquer la procédure et suivre un tuto dont le lien est donné sous forme de lien hypertexte vers son emplacement sur le réseau interne. Cependant, je souhaite aussi que ce message ne pollue pas les bons élèves qui auront appliqués la procédure et qui par conséquent auront les macros qui fonctionneront dès l'ouverture du fichier.

Voilà donc ce que j'ai fait.

1: enregistrement du fichier sur l'onglet accueil

2: à l'ouverture du fichier, 2 solutions
  • la sécurité des macros est désactivée : le workbook_open rend l'onglet travail visible, puis l'active, et masque l'onglet accueil
  • la sécurité des macros est activée et empêche donc l’exécution du workbook_open. le fichier s'ouvre alors sur le dernier onglet visible lors de l'enregistrement du classeur, en l’occurrence la feuille "Accueil"
Sur cette Feuille la procédure est donnée pour désactiver la sécurité (ou plutôt un lien vers cette procédure) et il y a un bouton de test, aucun autre onglet n'est visible du coup l'utilisateur (qui ne connait pas tres bien excel) ne pourra pas utiliser le classeur s'il ne va pas appliquer la procédure du tuto. Une fois la sécurité désactivée, l'utilisateur revient sur la feuille et clique sur le bouton. Vu que les macros sont activées cela masque cet onglet et fait apparaître l'onglet travail​

3: lorsque l'utilisateur veut quitter le classeur, l’événement before close gère le masquage de la feuille de travail et rend visible la feuille "Accueil" et il doit enregistrer cliquer sur enregistrer pour que ce soit pris en compte (m^me si il avait déjà procédé à un enregistrement avant de vouloir quitter.

C'est donc afin d'éviter cette étape 3 que j'espère pouvoir trouver une solution.
En effet, outre le fait que ce ne soit pas très "esthétique" de faire un changement d'onglet avant de quitter, je me dis qu'en temps normal, Excel doit bien associer un attribue "dernier onglet affiché" à chaque classeur lors de son enregistrement.
C'est cette procédure que j'aimerais pouvoir récupérer afin de la provoquer avant l'enregistrement qui sera lancé dans le beforeclose. Ainsi ce serait transparent pour l'utilisateur.

J'ai bien conscience que ma solution est un peu capilotractée, mais c'est la seule qui me soit venue à l'esprit et qui fonctionne dans l'état de mes connaissances actuelles.

Donc si parmi vous, quelqu'un connait la réponse à ma requête, voire une autre solution qui serait beaucoup plus efficiente, je suis preneur.

Dans l'attente de vous lire, je vous souhaite à tous une bonne fin de soirée ou une bonne journée en fonction de l'heure à laquelle vous me lirez.

Zorg
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Ne serait-il pas plus logique de le faire dans une Workbook_BeforeSave ?
Remarque: c'est plus compliqué que ça parce qu'il faut aussi planifier par Application.OnTime une procédure qui remet aussitôt en place la situation de travail …sauf si la fermeture a été demandée
 
Dernière édition:

zorglubxp

XLDnaute Junior
Ne serait-il pas plus logique de le faire dans une Workbook_BeforeSave ?
Merci Dranreb
C'est une piste intéressante, j'avoue ne jamais avoir utilisé cet événement (ni d'ailleurs avoir vu qu'il existait)
Je vais donc explorer ça, mais pas ce soir, là il faut que je fasse une pause :p

Pour ce qui est de l'Application.OnTime, je ne vois pas du tout de quoi il s'agit et ce que je pourrais en faire, donc je verrais ça aussi en demandant un peu d'aide à Google

Zorg
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, le forum

Comme mon fichier utilise beaucoup de macros, j'ai besoin que les options de sécurités soient désactivées.

[avis personnel du petit matin]
Si j'étais moi, je me dirai: quel insensé tu fais!
Avec un Excel ainsi configuré, bonjour les dégâts quand un classeur avec du VBA malveillant sera ouvert.
Sans compter les risques professionnels encourus en cas de gros pépin par le salarié responsable du dit pépin.

On peut faire de très gros dégâts avec du VBA comme on peut le lire ici:
https://www.ve-studio.net/blog/attention-les-virus-vba-sont-de-retour/
[/avis personnel]
 

zorglubxp

XLDnaute Junior
Oui c'est vrai cela augmente les risques, cependant le réseau d'entreprise est semi-fermé (pas de connexion internet) et une politique de SAS antivirus est mise en place pour tout élément qui vient de l'extérieur. Mais il est vrai que rien empêche qu'un utilisateur qui ne respecterait pas les procédures puisse importer un fichier malveillant sans précaution préalable.
Mais alors, que faudrait il faire pour permettre l'exécution de mes macros sans nuire à la sécurité ? (on s'éloigne pas mal du sujet initial)
 

Staple1600

XLDnaute Barbatruc

Dranreb

XLDnaute Barbatruc
Bonjour.
À essayer donc :
Dans un module standard :
VB:
Option Explicit
Public HOT As Date

Sub MasquerFeuilles()
Dim F&
ThisWorkbook.Sheets(1).Visible = xlSheetVisible
For F = 2 To ThisWorkbook.Sheets.Count
   ThisWorkbook.Sheets(F).Visible = xlSheetVeryHidden
   Next F
HOT = Now + TimeSerial(0, 0, 1)
Application.OnTime HOT, "DémasquerFeuilles"
End Sub

Sub DémasquerFeuilles()
Dim F&
For F = 2 To ThisWorkbook.Sheets.Count
   ThisWorkbook.Sheets(F).Visible = xlSheetVisible
   Next F
ThisWorkbook.Sheets(1).Visible = xlSheetHidden
HOT = 0
ThisWorkbook.Saved = True
End Sub
Dans Thisworkbook :
VB:
Option Explicit

Private Sub Workbook_Open()
DémasquerFeuilles
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
MasquerFeuilles
End Sub

Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
If HOT = 0 Then Exit Sub
Application.OnTime HOT, "DémasquerFeuilles", Schedule:=False
HOT = 0
End Sub
Remarque: la page de garde en position 1 des onglets peut être munie d'un objet de formulaire auquel est affectée la macro DémasquerFeuilles.
 
Dernière édition:

Si...

XLDnaute Barbatruc
Bonjour

J'en étais resté là …
VB:
'Dans ThisWorkbook
Private Sub Workbook_Open()
  'pour éviter de galoper partout
  Feuil3.ScrollArea = "B4"
  Application.DisplayFullScreen = 1
End Sub

'Dans un module
Dim sh As Worksheet
Sub Suite()
  For Each sh In Sheets: sh.Visible = 1: Next
  'plus ... pour une suite précise
End Sub
Sub Fin()
  For Each sh In Sheets
      If sh.Name <> "Accueil" Then sh.Visible = 2
  Next
  Application.DisplayFullScreen = 0
  ActiveWorkbook.Close
End Sub

où Suite et Fin sont 2 macros attachées à 2 messages dans l'onglet Accueil.
 

Pièces jointes

  • Accueil au départ.xlsm
    18.1 KB · Affichages: 59

Staple1600

XLDnaute Barbatruc
Bonjour le fil, le forum, zorglubxp, Dranreb, Si...

Sinon on peut à la base avant diffusion des classeurs, masquer les feuilles manuellement
(ou par macro avec les codes de Dranreb ou Si... par commodité, code VBA qu'on supprimera une fois les feuilles masquées)

Clic-droit>Visualiser le code> Mettre la propriété Visible sur xlSheetHidden pour chaque feuillez à masquer
Et diffuser le classeur ainsi modifié.

NB: Cela n’empêchera pas l’utilisateur de faire l'opération inverse en suivant le même mode opératoire mais en mettant xlSheetVisble
 

Dranreb

XLDnaute Barbatruc
Je pense que le désir du demandeur est que ce soit le plus transparent possible pour les utilisateurs:
Si le classeur est ouvert sans que les macros soient activées, on n'a que la 1ère feuille qui est une page de garde inutilisable, sauf pour débloquer la situation par un bouton après leur activation manuelle.
Si elles sont actives à l'ouverture, le classeur est immédiatement utilisable normalement et la page de garde n'apparaît pas.
Si on le sauvegarde, il doit l'être, sans trop gêner l'utilisateur, dans l'état qui garantit ces caractéristiques lors d'une ouverture ultérieure. Donc avec masquage des feuilles utiles juste avant sauvegarde, puis démasquage aussitôt après, sauf s'il s'avère qu'on est en phase de fermeture imminente certaine (Ce que permet de détecter Workbook_WindowDeactivate contrairement à Workbook_BeforeClose qui ne peut opérer qu'avant fermeture très hypothétique, vu qu'on peut annuler lors de la demande de confirmation d'enregistrement des modifications.).
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Dans ce cas figure
Bien que j'ai déjà envoyé la procédure à tous mes collègues, je sais que la majeure partie ne l'aura pas appliqué.
Macro ou pas macro, si les collègues peuvent ouvrir le classeur sans activer les macros ou accéder au projet VBA et inhiber ce qui entrave leur "liberté" d'utilisation d'Excel, je ne vois pas comment "blinder" la chose.

Sans oublier ce que je disais plus haut concernant le risque que représente un Excel paramétré avec le niveau de sécurité le plus bas.
 

zorglubxp

XLDnaute Junior
Bonjour le fil, le forum, zorglubxp, Dranreb

@zorglubxp

Peut-être voir de ce côté
https://support.office.com/fr-fr/article/Signer-numériquement-votre-projet-macro-956e9cc8-bbf6-4365-8bfa-98505ecd1c01

Sinon pour le sujet initial, masque toutes les autres feuilles, donc à l'ouverture, tu seras forcément sur la feuille déterminée.

Merci à tous pour votre aide et même si je ne suis pas tout le temps sur le forum, lorsque je fais mes sessions de dev, je fais à passage afin de vous répondre, d’essayer de comprendre les solutions proposées, de les mettre en application et de vous donner des nouvelles.

Bonjour le fil, le forum, zorglubxp, Dranreb

@zorglubxp

Peut-être voir de ce côté
https://support.office.com/fr-fr/article/Signer-numériquement-votre-projet-macro-956e9cc8-bbf6-4365-8bfa-98505ecd1c01

Sinon pour le sujet initial, masque toutes les autres feuilles, donc à l'ouverture, tu seras forcément sur la feuille déterminée.
J'ai regardé le lien que tu m'as envoyé, c'est intéressant cependant, dans mon cas, je ne pourrais pas l'exploiter. En effet je ne suis pas dev pro (je pense que ça se voit) et donc mon fichier n'est pas un produit fini et parfaitement fonctionnel, mais plutôt en perpétuel évolution, que ce soit pour corriger quelques bugs, fonctionnements non optimisés, mais aussi pour rajouter de nouvelles fonctionnalités. Or, dès que tu changes ne serait-ce qu'une ligne de code, il faut tout refaire, ce qui, outre le fait d'être chronophage, m'interdit d'opérer sur mon lieu de travail.

Sinon, pour la suggestion que tu me fais concernant le masquage des autres feuilles, et bien c'est déjà ce que je fais depuis le début, mais je trouve cela assez lourd, c'est donc pour cette raison que j'ai ouvert ce topic afin de trouver une solution plus légère.

NB: Cela n’empêchera pas l’utilisateur de faire l'opération inverse en suivant le même mode opératoire mais en mettant xlSheetVisble
Macro ou pas macro, si les collègues peuvent ouvrir le classeur sans activer les macros ou accéder au projet VBA et inhiber ce qui entrave leur "liberté" d'utilisation d'Excel, je ne vois pas comment "blinder" la chose.
Les utilisateurs ne sont pas des geeks, loin de là. Ce qu'ils veulent c'est un fichier fonctionnel qui rend le service pour lequel il a été créé, ils ont d'autres choses à faire que d'essayer de voir ce qu'il y a dedans. Sur les 80 /90 potentiels, je pense que seuls 2 ou 3 ont déjà entendu parler de VBA. Donc je ne crains pas de ce côté là.
Ce que j'essaye de contourner, c'est le côté humain (donc fainéant par nature). Lorsque le fichier va s'ouvrir, ils vont préférer activer manuellement les macros que d'appliquer la procédure demandée (au risque de faire bondir certain). Alors oui, ma solution de faciliter l'utilisation du fichier au détriment de la sécurité est très certainement discutable, mais c'est un choix car je n'ai pour le moment pas trouver d'autres solutions viables

@Dranreb
Dans ton post n°10, tu as parfaitement résumé ma demande. Je vais essayer ton code, que j'ai pour l'instant du mal à comprendre, du fait que je ne connaisse pas encore la fonction Application.OnTime.

@Si...
J'ai essayé ton fichier et cela me convient aussi.

Cependant, prenons le cas d'un utilisateur qui travaille sur le fichier, qui fait un enregistrement en cours de travail, puis qui continue de travailler. Au moment ou il veut quitter le fichier, il se rend compte qu'i a fait des erreurs ou que le contexte à évoluer depuis son dernier enregistrement, il décide alors de quitter sans enregistrer. Dans ce cas, le dernier enregistrement ayant été effectué avec l'onglet de travail visible et l'onglet accueil masqué, le prochain utilisateur qui voudra ouvrir le classeur, si la sécurité des macros est toujours activée sur son poste, atterrira malgrès tout sur la feuille "travail" et non sur la feuille "accueil" .

C'est pour cela qu'il me semble maintenant plus opportun de travailler sur le beforsave plutôt que le before close (pour la sortie).
Mais faire un jeu de masquage / démasquage pendant la procédure d'enregistrement peut être perturbant.

Maintenant après réflexion, cela ne me gène pas que les onglets "Accueil" et "Travail" restent visible quelque soit l'activation ou non des macros, l'essentiel étant que l'ouverture se fasse sur "travail pour celui qui a activé les macros en permanence (facile car workbook open), mais aussi, uniquement sur l'onglet accueil pour celui qui n'a pas les macros d'activée à l'ouverture du fichier, quelque soit l'état du dernier enregistrement.

J’espérais dans mon fort intérieur, qu'Excel mette un attribut "feuille_à_afficher_à_l'ouverture" par défaut sur l'onglet à afficher lors du dernier enregistrement mais que cet attribut puisse être "forcé" par macro VBA

En fait, je m’apprêtais à vous écrire un semblant de code allant dans mon idée, mais en l'écrivant, je tombe sur un paradoxe dans le cas d'une sortie sans enregistrement après avoir fait un enregistrement intermédiaire. Même si j'arrivais à dire à Excel lors d'un before_save, d'ouvrir sur l'onglet "Accueil", vu qu'il va se fermer sur l'onglet "travail", il se ré-ouvrira sur l'onglet travail. Donc s'il n'y a pas de solution d'enregistrer cette propriété dans le dure à l'instar de ce qui se fait pour les propriétés d'un USF par exemple, l'autre piste serait peut être de spécifier l'instruction d'ouverture dans le raccourcis ou si ce n'est pas possible, dans un .bat

Désolé, si je pars dans tous les sens, mais je pensais que ce serait beaucoup plus simple :oops:

En tout cas, merci encore pour le temps que vous passez sur ma demande ;)
 

Discussions similaires

Statistiques des forums

Discussions
312 104
Messages
2 085 337
Membres
102 865
dernier inscrit
FreyaSalander