XL 2013 problème avec xlsheetveryhidden

yanthom

XLDnaute Nouveau
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.
 
Solution
J'ai bien peur que vous ayez un souci avec votre XL :
20201201_141055.gif

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 )

sylvanu

XLDnaute Barbatruc
Supporter XLD
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
 

Pièces jointes

  • FeuilleInvisible.xlsm
    17 KB · Affichages: 4

yanthom

XLDnaute Nouveau
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

Exit For
End If
Next i

End If

Set Ws = Nothing

Application.ScreenUpdating = True

Unload Me

Sheets("Menu").Activate

End Sub
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
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
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
... et ne pas oublier de mettre dans ThisWorkbook :
VB:
Private Sub Workbook_Open()
For Each Sh In Worksheets
    If Sh.Name <> "Entete" Then
        Sheets(Sh.Name).Visible = xlSheetVeryHidden
    End If
Next Sh
End Sub
sinon à la prochaine ouverture des feuilles seront visibles suivant le dernier état avant fermeture.
 

yanthom

XLDnaute Nouveau
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

Next Ws

ThisWorkbook.Save
End Sub
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Où avez vous mis le module
VB:
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.
 

yanthom

XLDnaute Nouveau
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

Toujours aucun changement pour le moment.
 
Haut Bas