Microsoft 365 Macro : masquer un onglet quand on ferme un classeur

Caro99

XLDnaute Nouveau
Bonjour la communauté !

C'est mon premier message ! #fière !

J'ai eu une formation sur les macros fin février et je démarre doucement par une urgence 😅
On m'a demandé de diffuser à plusieurs personnes mon fichier de budget mais dans le même temps de ne pas donner l'accès à tout le monde à l'onglet sur les frais de personnel car y figure tous les salaires nominatifs. Grâce à vous sur d'autres fils de discussion j'ai pu créer mon premier pas : faire un message qui demande le mot de passe, s'il est bon l'onglet s'affiche, sinon il a un message d'erreur.

Ce que je n'arrive pas à faire c'est la fin. J'aimerai que quand l'utilisateur ferme le classeur la feuille se masque d'elle-même.

J'ai pensé à faire un 2ème bouton avec "protéger l'onglet", mais si quelqu'un qui a consulté le fichier ferme le classeur en l'état en oubliant de protéger à nouveau l'onglet ce dernier sera visible pour le prochain utilisateur.

Je vous mets un fichier test sans données en PJ.

Merci pour votre aide !
 

Pièces jointes

  • Fichier test pour VBA onglet confidentiel.xlsm
    20.2 KB · Affichages: 20
Solution
Bonjour Caro99,

bienvenue sur le site XLD ! :)

j'ai reconnu la coccinelle de Gotlib ! 😄 en voici une autre : 🐞

ton fichier en retour ; après avoir affiché la feuille "FRAIS DE PERSO" à l'aide de ton mot de passe, ferme le fichier, puis ouvre-le de nouveau pour vérification.​

soan

soan

XLDnaute Barbatruc
Inactif
Bonjour Caro99,

bienvenue sur le site XLD ! :)

j'ai reconnu la coccinelle de Gotlib ! 😄 en voici une autre : 🐞

ton fichier en retour ; après avoir affiché la feuille "FRAIS DE PERSO" à l'aide de ton mot de passe, ferme le fichier, puis ouvre-le de nouveau pour vérification.​

soan
 

Pièces jointes

  • Fichier test pour VBA onglet confidentiel.xlsm
    19.1 KB · Affichages: 16

Caro99

XLDnaute Nouveau
Hello !

Quelle réponse rapide !! 😍 Oui c'est Gotlib ! J'adore même si ce n'est pas de ma génération 😏

Sur ton fichier ça fonctionne bien ! Mais quand j'implémente sur mon fichier de budget en copié/coller cela ne fonctionne plus.

Les étapes :
1- j'ai copié collé ta macro
2- J'ai masqué mon onglet et ai mis un mot de passe sur le fichier pour que personne ne renomme les onglets
3- J'ai enregistré puis ai ré-ouvert

Et j'ai un bug ici :
1615573979179.png


J'avoue ne pas du tout comprendre ce que tu as écris 🤣 pourquoi "Worksheets" et non "Sheets" ?
Et pourquoi la formule commence par un "." et que veux dire le -1 ?

Merci de ton aide !
Carole.

(PS-Je vais être en congé donc difficile de te répondre mais je me connecte dès mon retour !)
 

soan

XLDnaute Barbatruc
Inactif
Bonsoir Carole,

Sheets est l'ensemble de toutes les feuilles du classeur, quelque soit leur type ; ce sont donc les feuilles de calcul, mais aussi les feuilles graphiques, les anciennes feuilles de boîte de dialogue qui ont précédé les UserForm, etc... alors que Worksheets est un sous-ensemble de la collection Sheets, qui représente uniquement les feuilles de calcul ; Excel trouve donc plus rapidement une feuille de calcul avec Worksheets car il la cherche uniquement dans le sous-ensemble Worksheets et pas dans la collection entière de toutes les feuilles.

en VBA, True a pour équivalent numérique -1 et False a pour équivalent numérique 0 ; sur la feuille de calcul, c'est la même chose pour FAUX = 0 ; mais pour VRAI : ça équivaut à 1, PAS à -1 ! et là, je ne parle pas du texte "VRAI" ou "FAUX" mais de la valeur VRAI ou FAUX ! donc la valeur renvoyée par exemple par un test SI()

comme la syntaxe est correcte, l'erreur vient probablement du nom de ta feuille : peut-être que tu as mis un espace en trop au nom de ta feuille de calcul ? vérifie si c'est pas "FRAIS DE PERSO " au lieu de "FRAIS DE PERSO" ! ou peut-être que c'est "FRAIS DE PERSONNEL" au lieu de "FRAIS DE PERSO" ? 😁 😜

j'espère quand même que ta feuille est bien une feuille de calcul et pas une feuille d'un autre type ! attention : si c'est le cas, tu es en grand danger : tu risques fort de faire des rencontres du 3ème type... et de te faire enlever par une soucoupe volante ! 🛸 😁 (ça y'est, Carole voyage parmi les étoiles vers une galaxie inconnue !)



tu m'as aussi demandé pourquoi la formule commence par un point ; on dit plutôt une instruction, et le point indique qu'il dépend du With situé au-dessus, donc de : With Worksheets("FRAIS DE PERSO")

c'est comme si j'avais mis, sans utiliser With :

Worksheets("FRAIS DE PERSO").Visible = -1
Worksheets("FRAIS DE PERSO").Select


j'espère que tu as vu aussi ce code VBA qui est dans le module ThisWorkbook :
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Application.ScreenUpdating = 0: Worksheets("INFO").Select
  Worksheets("FRAIS DE PERSO").Visible = 2
End Sub

c'est aussi à copier / coller dans ton vrai classeur ! ;)
soan
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Bonjour Carole,

dans ton post #3, tu as écrit : « (PS-Je vais être en congé donc difficile de te répondre mais je me connecte dès mon retour !) »

t'es toujours pas revenue d'congé ? t'as pas dit pour combien d'temps tu partais, ni à quelle date tu reviens ! 😭 😭 😭 t'as p't'être droit à 2 mois d'vacances, comme les profs ? 😜 si oui, profites-en bien, et à dans 2 mois ! 😁 😄 bon, à ton retour, que ça t'empêche pas de lire mon post #4 ; et j'ajoute ici le code VBA du fichier de mon post #2 :
VB:
Sub afficher()

  Dim MDP

  'demander à saisir le MDP
  MDP = InputBox("Saisissez le mot de passe")

  'si le MDP est correct alors afficher la feuille puis se placer dessus sinon préciser mot de passe faux
  If MDP = "123" Then
    With Worksheets("FRAIS DE PERSO")
      .Visible = -1: .Select: [A118].Select
    End With
  Else
    MsgBox "Mot de passe erroné"
  End If
End Sub

oh ! j'viens d'voir que j'avais oublié d'mettre le type de la variable MDP ! :oops:
donc au lieu de DIM MDP mets : DIM MDP$ : idem que Dim MDP As String



bien sûr, ce post est complètement inutile si tu t'plais tellement à Hawaï ou à Tahiti que tu décides d'y rester pour toujours ! 😛 paraît qu'l'île de La Réunion, c'est plutôt pas mal aussi ! 🤣

soan
 

Caro99

XLDnaute Nouveau
Whouaaaaa !!! Hello Soan from Hawaiiii !! 🏝

Nan c'est pas vrai .. dommage d'ailleurs, rentrée de 2 semaines de congés mais énormément prise par le taf, et travailler sur du VBA en débutante .. me demande du temps 😁 Je suis en train de redescendre toutes tes informations !!

ThisWorkbook :
Et bien non je n'avais pas vu le module dans Thisworkbook ... mais j'ai fini par trouver que la propriété de la feuille avait changé .. et je pense que c'est ce bout de code qui l'a changé si je comprends bien 😉 ! Je ne savais pas qu'on pouvait inscrire des VBA directement dans Thisworkbook le prof a oublié de me préciser cela lors de sa formation !

1- A quoi ça sert de travailler dedans et non dans un module ?

2- Par ailleurs dans ton VBA :
Application.ScreenUpdating = 0: Worksheets("INFO").Select
Worksheets("FRAIS DE PERSO").Visible = 2
Si je comprends bien ça dit : figer la fenêtre quand la macro s'exécute (confort de l'utilisateur) - compris
Puis se mettre sur la feuille Info (au moment de la fermeture) c'est bien ça ? - pas compris
Et enfin : changer la propriété de la feuille Frais de perso en la mettant veryhidden - compris

Le point en langage VBA :
Pour l'instruction si je comprends bien je peux en enchainer plusieurs sans avoir à répéter que c'est pour la même feuille de travail ? Mais c'est pratique ça !

Bien compris pour le Dim MDP as String !

Je ne pensais pas m'être lancée dans un code aussi compliqué pour mon premier VBA 😂 et dire que je vais en travailler d'autres sur le même thème que les mots de passe .. 😅 J'essaie de bien tout comprendre et intégrer toutes les notions que tu m'as donné. Mes petites cellules grises commencent à s'illuminer avec tes explications 🤩 Oui j'aime aussi Hercule Poirot ..

En tout cas merci et encore merci pour ces aides ! Ça fonctionne !!!
On va certainement se recroiser sur ce forum .. !
Caro.
 

Caro99

XLDnaute Nouveau
Bonjour @Phil69970 !

J'ai des fichiers qui font parfois 24 onglets et plusieurs personnes y touchent, du coup pour protéger les formules et les mauvaises manip je les bloque par mot de passe, mais quand j'ai besoin de modifier ces fichiers pour les faire évoluer .. c'est la catastrophe .. en plus ils sont en 12 exemplaires pour 12 établissements !

Je vais tenter et on va bien voir !
 

soan

XLDnaute Barbatruc
Inactif
Bonjour Caro, (réponse à ton post #6 ; salut Phil)

tu as écrit : « Je ne savais pas qu'on pouvait inscrire du code VBA directement dans ThisWorkbook ; le prof a oublié de me préciser cela lors de sa formation ! »

la plupart du temps, on écrit du code VBA dans un module « standard » ou « classique » comme Module1 ; cependant : si la macro est une sub événementielle, on la met :

* dans ThisWorkbook si cette sub doit se déclencher pour un événement du Classeur (voici 4 exemples : à l'ouverture du classeur ; à l'activation du classeur ; juste avant de sauvegarder le classeur ; juste avant la fermeture du classeur)

* dans le module de "Feuil1" si cette sub doit se déclencher pour un événement de "Feuil1" (voici 3 exemples : activation de "Feuil1" ; modif d'une cellule de "Feuil1" ; changement de la sélection sur "Feuil1")

attention : une sub événementielle qui doit se déclencher pour toutes les feuilles du classeur doit être placée dans ThisWorkbook ; exemple : la sub Workbook_SheetActivate() se déclenchera en cas d'activation d'une feuille quelconque du classeur, quelque soit le nom de cette feuille.​



il y a aussi le code VBA spécifique à un UserForm (formulaire) ; le code VBA de ce formulaire doit être placé dans le module de ce UserForm.

y'a aussi le code VBA spécifique à un module de classe, mais c'est beaucoup plus technique, et j'm'y connais mal là-dessus ; j'm'en sers quasiment jamais, mais c'est bien d'savoir que ça existe aussi ; c'est réservé aux spécialistes du VBA.​



tout ce que j'ai écrit ci-dessus répond aussi à ta question : « À quoi ça sert de travailler dedans et non dans un module ? »​



pour la sub Workbook_BeforeClose() :

* Application.ScreenUpdating = 0 : tu as bien compris : figer la mise à jour de l'écran = « gel » de l'écran ➯ c'est plus rapide ; et c'est aussi plus confortable pour l'utilisateur car il ne voit pas les divers changements de feuilles (en l'occurrence, ici, un seul changement de feuille).

* Worksheets("INFO").Select puis Worksheets("FRAIS DE PERSO").Visible = 2 : avant de masquer (cacher) la feuille "FRAIS DE PERSO", je sélectionne une des feuilles du classeur qui est visible, ici la feuille "INFO" ; au cas où tu enlèverais Worksheets("INFO").Select et que ça masque la feuille "FRAIS DE PERSO" alors que tu étais dessus, la nouvelle feuille active sera forcément l'autre feuille pour un classeur qui contient 2 feuilles seulement (sachant que c'est impossible de masquer toutes les feuilles d'un classeur : en effet, c'est obligé qu'une feuille au moins soit visible) ; si le classeur a plus que 2 feuilles, quelle sera la nouvelle feuille active si tu masques "FRAIS DE PERSO" alors que c'était la feuille active ? peut-être la dernière feuille du classeur ? ou plutôt la feuille qui est juste à gauche de la feuille masquée ? ou celle qui est juste à droite de la feuille masquée ? j'en sais rien, et je n'ai pas cherché à le vérifier ; à la place, j'ai préféré choisir d'emblée la feuille "INFO" ; libre à toi de choisir une autre feuille si ça te convient mieux. :) (comme ton fichier réel peut avoir jusqu'à 24 feuilles, on peut dire que tu as le choix ! 😁 bonne chance pour tes 12 fichiers, à raison d'un fichier par établissement ; tu vois, j'ai bien lu ton post #8 aussi)



dans un bloc With .. End With toute instruction qui commence par un point en dépend ; donc pour ce bout de code VBA :​

VB:
With Worksheets("FRAIS DE PERSO")
  .Visible = -1: .Select: [A118].Select
End With

c'est idem que si j'avais écrit :

VB:
Worksheets("FRAIS DE PERSO").Visible = -1
Worksheets("FRAIS DE PERSO").Select
[A118].Select

note bien que je sélectionne la cellule A118 sur la feuille active (c'est implicite, car il n'y a pas de référence de feuille explicite indiquée) ; cette feuille active est la feuille "FRAIS DE PERSO", car je l'ai sélectionnée juste avant avec le .Select inclus dans le bloc With Worksheets("FRAIS DE PERSO") .. End With ; note bien aussi que je n'ai pas mis .[A118].Select : le point est inutile puisque grâce à .Select c'est la feuille "FRAIS DE PERSO" qui est devenue la feuille active.​

j'aurais aussi pu écrire (résultat identique) :

VB:
With Worksheets("FRAIS DE PERSO")
  .Visible = -1: .Select
End With
[A118].Select



j'espère que toutes ces infos te plairont, et que ça ne te fera pas trop de notions à ingurgiter. 😁 aussi, je souhaite bon courage et longue vie à tes jolies petite cellules grises ! qu'elles s'illuminent encore longtemps, et te donnent la joie de vivre en général, et la joie d'étudier le VBA en particulier ! 😜 (Amen)

euh... alors comme ça t'as pas eu envie d'habiter pour toujours à Hawaï ? 😜 t'as préféré revenir trimer en France ? 😁 (non, stp, ne m'lance pas des tomates pourries ! 🤪)

Image.jpg


soan 🌹
 
Dernière édition:

Caro99

XLDnaute Nouveau
Hello Soan !

Mes cellules grisent avancent bien 😁 je prends des réflexes petit à petit ! J'ai bien compris tes explications, tu expliques vraiment bien et je t'en remercie ! Impossible de te lancer des tomates pourries malgré la vanne 🤣

Techniquement je dois fermer le sujet ? Ou simplement laisser la conversation ?

@+ sur ce site !

Carole.
 

soan

XLDnaute Barbatruc
Inactif
Bonjour Carole,

j'suis bien content qu'tu sois revenue, c'est sympa ! 😊

pour clore un sujet, tu peux marquer comme solution le post qui a résolu ton exo ; pour faire cela, il te suffit de cliquer sur la coche en forme de V qui se trouve sur le bord vertical droit du post.

je t'avais écrit un MP le 6 avril ; je te laisse le lire. ;) (pour lire tes MP, clique sur la petite enveloppe qui est en haut d'écran, à droite de ton pseudo ; tu dois voir un chiffre blanc sur fond rouge)

soan 🌷
 

Discussions similaires

Statistiques des forums

Discussions
314 645
Messages
2 111 536
Membres
111 185
dernier inscrit
Laurent.