Salut, j'ai créé un code pour masquer les feuilles ou onglets de mon classeur en fonction du niveau d'accès des utilisateurs. Et j'y suis parvenu donc tout semblait ok jusqu'au moment où j'ai constaté que les feuilles sélectionnées étaient effectivement visibles, mais celles qui devaient rester masquer (veryhidden), en fait ne l'étaient pas. (hidden =>Click droit sur l'onglet =>Afficher...)
J'ai vérifié au niveau de l'éditeur de code VBA, dans les propriétés des feuilles masquées, et elles sont en xlsheetveryhidden.(Ce qui ne réflète pas la réalité)
J'ai eu l'impression qu'on ne pouvait pas rendre visible certaines feuilles sans toutefois maintenir le niveau d'invisibilité des autres feuilles.
J'aimerais savoir si quelqu'un a déjà fait face ce problème, ou si possible pourrait m'apporter des éléments de réponse.
Je ne vois pas l'intérêt de masquer des feuilles si on peut facilement y avoir accès avec le click droit de la souris.
J'ai bien peur que vous ayez un souci avec votre XL :
Tentez un controle pour voir avec, Options/Ressources/Exécuter les diagnostics MS Office.
( Ca doit être différent sur 2013 mais ça doit ressembler )
Une piste par le code vba tu transformes (à l'insu de ton plein gré)une feuille qui est veryhidden en feuille hidden ce qui la rend affichable avec le clic droit ...
Sans fichier (anonyme) il est difficile de se prononcer ....
Il faudrait nous fournir le fichier "objet du délit".
Personnellement je vois tant de gens masqués que j'ai démasqué toutes les feuilles de mes classeurs pour me rappeler le temps d'avant... Bon, je sors.
Bonsoir Yanthom, Phil, Mapomme,
En PJ une démo où les feuilles masquées ne sont pas visibles par l'option Afficher.
VB:
Sub Cacher()
Nom = Right(Application.Caller, 1)
For Each Sh In Worksheets
If Sh.Name <> "Entete" Then
Sheets(Sh.Name).Visible = xlSheetVeryHidden
End If
Next Sh
Sheets(Nom).Visible = xlSheetVisible
End Sub
Je te remercie Phil pour ta démo, je vais essayer de l'adapter au code.
Pour les autres qui ont bien voulu répondre à ma préoccupation:
Voici mon code, et j'ai créé une feuille "configuration" où l'on retrouve le nom des autres feuilles (qui peuvent être masquées ou pas) et les différents utilisateurs qui ont accès aux feuilles.
Private Sub CboConnexion_Click()
Dim Ws As Worksheet
Dim mdp As String
Dim connected As Boolean
Dim Lr As Long
Dim User As String
Dim Action As String
Dim SheetNm As String
Application.ScreenUpdating = False
Set Ws = Sheets("Configuration")
Lr = Ws.Range("A" & Rows.Count).End(xlUp).Row
connected = False
If Me.TextBox1 = "" Or Me.TextBox2 = "" Then
MsgBox "Veuillez remplir tous les champs."
Exit Sub
End If
User = Me.TextBox1
mdp = Me.TextBox2
For Each c In Ws.Range("A2:A" & Lr)
If c = User And c.Offset(, 1) = mdp Then
connected = True
Exit For
End If
Next c
If connected = False Then
MsgBox "Vos identifiants sont incorrects."
Me.TextBox1 = ""
Me.TextBox2 = ""
Exit Sub
Else
For i = 2 To Lr
If Ws.Range("A" & i).Value = User Then
For k = 3 To 16
SheetNm = Ws.Cells(1, k).Value
If Ws.Cells(i, k).Value = "X" Then
Sheets(SheetNm).Visible = xlSheetVisible
End If
Next k
MsgBox " Bienvenu " & User
End if
Dans votre macro il n'y a nulle part xlSheetVeryHidden. Donc à chaque feuille qui passe en visible elle le reste.
Regardez ma macro, il vous faut mettre toutes les feuilles en xlSheetVeryHidden avant d'en rendre une visible :
VB:
For Each Sh In Worksheets
If Sh.Name <> "Entete" Then
Sheets(Sh.Name).Visible = xlSheetVeryHidden
End If
Next Sh
Le code est long mais je l'ai déjà fait pour un module lors de la fermeture du classeur; à moins qu'il faille de nouveau le faire lors du Workbook open??!!
C'est celui là:
Sub masquer()
Feuil9.Activate
Dim Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Accueil" Then
Ws.Visible = xlSheetVeryHidden
End If
Exact, c'est mieux à la fermeture. Sorry.
... car il suffit d'invalider les macros pour avoir accès aux feuilles visibles à l'ouverture puisque la macro ne peut s'exécuter.
ok, j'ai essayé mais malheureusement j'obtiens toujours le même résultat, les feuilles sélectionnées sont visibles, et pour les autres, elles sont disponibles au niveau de la "unhide sheet dialog box"
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Accueil" Then
Ws.Visible = xlSheetVeryHidden
End If
Next Ws
Juste après les Dim ?
Il doit être absolument là car vous avez des Exit Sub un peu partout. Il faut que quand l'utilisateur appelle cette macro, ce masquage soit la première chose faite.
je l'ai mis dans le Workbook open comme vous me l'avez recommandé. oui effectivement, je l'ai mis après la variable dim.
Je change la position et je vois ce que ça donne.
Vous mélangez deux choses.
Il doit être dans la macro pour cacher les feuilles pendant l'utilisation du fichier ET dans Thisworkbook pour cacher les feuilles en sortant.
Cette dernière n'est activée que quand on sort, elle n'impacte pas le fonctionnement "normal" du fichier.
je l'ai inséré également dans la macro juste avant le code de balayage à la recherche du "X"
Donc, juste avant ce code, afin qu'il masque les feuilles
For i = 2 To Lr
If Ws.Range("A" & i).Value = User Then
For k = 3 To 16
SheetNm = Ws.Cells(1, k).Value
If Ws.Cells(i, k).Value = "X" Then
Sheets(SheetNm).Visible = xlSheetVisible
End If
Next k