Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Macro pour masquer des feuilles avec MDP

BOURGUIGNON

XLDnaute Nouveau
Bjr,
Sur mon fichier Excel j'ai 6 personnes; j'ai créé une macro pour que chaque personne puisse ouvrir uniquement sa feuille (et pas les autres) en entrant son MDP (pour l'instant le MDP de chacun est son prénom). Mon souci est que la fenêtre qui s'ouvre (après avoir cliqué sur sur le Bouton dans la feuille d'accueil) qui demande le MDP, s'ouvre 6 fois (il faut rentrer 6 fois son MDP). Pour info le MDP "eric" (administrateur) ouvre toutes les feuilles.
Merci de me donner l'astuce pour n'avoir qu'1 fois l'ouverture de la fenêtre pour rentre le MDP et non 6 fois.
 

Pièces jointes

  • Feuilles de tâches.xlsm
    51.6 KB · Affichages: 33

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum, BOURGUIGNON, Dranreb

@BOURGUIGNON
Une façon d'écrire ta macro
(en attendant plus concis )
VB:
Sub voirfeuille()
Dim PWD, WS As Worksheet, X$, Voir$
PWD = Array("eric", "cyrille", "céline", "ginette", "fred", "juliette")
X = InputBox("Mot de passe ?")
Voir = Choose(Application.Match(X, PWD, 0), "ERIC", "Cyrille", "Céline", "Ginette", "Fred", "Juliette")
For Each WS In Worksheets
If WS.Name = "Garde" Or WS.Name = "Accueil" Or WS.Name = Voir Then
WS.Visible = True
Else
WS.Visible = False
End If
Next
End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Oui, bon j'aurais voulu qu'il cherche un peu comment on déclare une variable.
J'avais écrit ça :
VB:
Option Explicit
Sub VoirFeuille()
Dim Rép As String, Wsh As Worksheet
Rép = InputBox("Mot de passe ?")
If Rép = "eric" Then
   For Each Wsh In ThisWorkbook.Worksheets
      Wsh.Visible = xlSheetVisible: Next Wsh
Else
   On Error Resume Next
   Set Wsh = ThisWorkbook.Worksheets(Rép)
   Wsh.Visible = xlSheetVisible
   Wsh.Activate: End If
End Sub
Et dans son ThisWorkbook
VB:
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Wsh As Worksheet
For Each Wsh In Me.Worksheets
   If Wsh.Name <> "Accueil" Then Wsh.Visible = xlSheetVeryHidden
   Next Wsh
End Sub
 

BOURGUIGNON

XLDnaute Nouveau
Super je te remercie car je ne suis pas un expert en VBA (je copie plutôt des macro déjà faites sur internet). par contre est ce que tu peux stp me rajouter dans ta proposition le fait qua quand on tape eric ça ouvre toutes les feuilles car eric est l'administrateur. Merci encore une fois c'est bien de tomber sur des cracs qui répondent en plus vite
 

BOURGUIGNON

XLDnaute Nouveau
Re

Pour rejoindre Dranreb

Je te laisse faire des essais et/ou tatonner et/ou relire le message#4
Et en tirer les conséquences

Pour l'heure, moi je vais me coucher.

Bonne nuit.
Bjr Dranreb, je n'arrive pas à faire apparaître TOUS les onglets de chaque personne quand je tape uniquement "eric" (qui est l'administrateur). Je ne m'y connais pas en VBA (j'apprends sur ne NET...) Merci par avance pour ton aide; slts
 

Pièces jointes

  • Feuilles de tâches.xlsm
    48.4 KB · Affichages: 36

BOURGUIGNON

XLDnaute Nouveau
Bonjour.
Les procédures au poste #4 le font.
Bjr Dranreb, et si je veux pour que chaque personne me donne son MDP et qu'ensuite quand il reçoit le fichier il rentre SON MDP pour ouvrir juste sa feuille . exemple Cyrille MDP = 7284, Fred MDP = 140572. Merci par avance pour ton aide (je n'ai pas encore commencé les cours ....)
 

Pièces jointes

  • Feuilles de tâches Mg 2018-V2.xlsm
    54.4 KB · Affichages: 26

Dranreb

XLDnaute Barbatruc
Bonjour.
Ça dépend où et comment vous voulez que soient rangés les mots de passe
Le mieux à mon avis ce serait ce serait quand même que le nom soit d'abord demandé, et ensuite seulement le mot de passe.
Ça peut d'ailleurs être le mot de passe de protection de la feuille
 

BOURGUIGNON

XLDnaute Nouveau
Oui bonne idée par exemple Cyrille rentre son prénom et ensuite son MDP est demandé. Vous pouvez m’écrire ça dans mon fichier ? Je Vous remercie par avance cdlt
 

Dranreb

XLDnaute Barbatruc
Essayez comme ça :
VB:
Option Explicit
Sub VoirFeuille()
Dim Rép As String, Wsh As Worksheet
Rép = InputBox("Mot de passe ?")
If Rép = "eric" Then
   For Each Wsh In ThisWorkbook.Worksheets
      Wsh.Visible = xlSheetVisible: Next Wsh
Else
   On Error Resume Next
   Set Wsh = ThisWorkbook.Worksheets(Rép)
   If Err Then Exit Sub
   Wsh.Unprotect
   If Err Then Exit Sub
   Wsh.Visible = xlSheetVisible
   Wsh.Activate: End If
End Sub
 

BOURGUIGNON

XLDnaute Nouveau
Bjr Dranreb, je viens d'essayer (chez moi c'est le matin) et c'est la même chose que précédemment . eric ouvre bien tous les onglet en tant qu'ADMIN mais quand je tape cyrille ça ouvre l'onglet cyrille et je n'ai pas un mot de passe qui est demandé. En fin de compte je souhaite avec un MDP pour chacun de mes managers . Quand je leur envoie le fichier ils ne doivent pas avoir accès aux onglets de leur collègues… Merci par avance si vous pouvez me trouver quelque chose ...cdlt
 

Dranreb

XLDnaute Barbatruc
C'est parce que la feuille n'est pas protégée par un mot de passe, alors la dé-protection n'en demande pas un.
Maintenant si vous avez peur qu'un collaborateur ne se souvienne plus de son mot de passe, peut être ne faut-il pas employer le mot de passe de protection de la feuille, mais si vous voulez que ce soient des mots de passe perso, vous ne m'avez toujours pas dit où vous voulez qu'ils soient stockés, pour que toute personne un peu curieuse finisse par les trouver. Une solution en stockant dans un nom propre à la feuille plutôt un codes d'accès calculé d'après le mot de passe :
VB:
Option Explicit
Sub VoirFeuille()
   Dim Nom As String, Rép As String, Wsh As Worksheet, CodAcc#, CodCry#
   Nom = InputBox("Nom ?"): If Nom = "" Then Exit Sub
   On Error Resume Next
   Set Wsh = ThisWorkbook.Worksheets(Nom)
   If Err Then MsgBox "il n'existe pas de feuille """ & Nom & """.", _
      vbCritical, "Voir feuille": Exit Sub
   CodCry = CodeCrypté(InputBox("Mot de passe ?"))
   CodAcc = Wsh.[CodeDAccès]
   If Err Then
      If CodeCrypté(InputBox("Confirmez ce mot de passe SVP.")) <> CodCry _
         Then MsgBox "Accès dénié.", vbCritical, "Voir feuille": Exit Sub
      Wsh.Names.Add "CodeDAccès", CodCry
   ElseIf CodCry <> CodAcc Then
      MsgBox "Accès dénié.", vbCritical, "Voir feuille": Exit Sub: End If
   Wsh.Visible = xlSheetVisible
   Wsh.Activate
   If UCase(Nom) = "ERIC" Then
      For Each Wsh In ThisWorkbook.Worksheets
         Wsh.Visible = xlSheetVisible: Next Wsh: End If
   End Sub
Function CodeCrypté(ByVal MdP As String) As Double
   Const NOr = (5 ^ 0.5 + 1) / 2: Dim Code#, P&, A#
   For P = 1 To Len(MdP): A = Asc(Mid$(MdP, P, 1)) / &H100
      Code = (Code + A) ^ 7 + NOr: Code = Code - Int(Code): Next P
   CodeCrypté = Int(Code * 1E+15)
   End Function
Sub MotDePasseOublié()
   If MsgBox("Êtes-vous sûr de vouloir supprimer le code d'accès de cette feuille ?", _
      vbYesNo + vbExclamation, "Mot de passe oublié") = vbNo Then Exit Sub
   On Error Resume Next
   ActiveSheet.Names("CodeDAccès").Delete
   End Sub
Comme ça, même si c'est toujours un peu moins inviolable que le mot de passe de protection de la feuille, au moins personne à part son auteur ne sait quel mot de passe aboutit à ce code d'accès enregistré.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…