VBA protection feuille aléatoire

Résolu/Fermé
AMO255 Messages postés 6 Date d'inscription jeudi 15 novembre 2018 Statut Membre Dernière intervention 20 novembre 2018 - 15 nov. 2018 à 16:17
AMO255 Messages postés 6 Date d'inscription jeudi 15 novembre 2018 Statut Membre Dernière intervention 20 novembre 2018 - 20 nov. 2018 à 12:44
Bonjour,

J'écris pour la première fois. VBA est pour moi un mystère, j'apprends à petite dose grâce à l'enregistreur et grâce à ceux qui donnent du temps comme vous pour répondre et partager leur savoir

j'ai créer un vba pour un fichier, que je ne peux pas diffuser, car professionel.
Je bloque au niveau de la protection de la feuille, ça se fait pour certaines personnes pas d'autres...

Je souhaite
- que certaines feuilles soient masquées = ok

- qu'un 1er filtre se fasse sur la colonne A, suivant le nom d'office (excel) et une base de données sur une autre page (feuil2)
= code trouvé sur internet
p.ex. si j'ouvre le fichier et que je suis sur la liste, je ne vois que les cellules de la colonne A qui contiennent "AMO"

- qu'un filtre se fasse sur la colonne C, sur les cellules sans remplissage = ok


- qu'il protège la feuille avec un mot de passe
= ici je coince, j'ai remarqué que si j'enlève mon nom de la liste "utilisateurs" la feuille n'est plus protegée lorsque je l'ouvre. Est-ce que dans le code que j'ai recuperé sur internet, y a qch qui demande ça ?

Je voudrais que le fichier soit protegé de tous.
Que ceux qui sont sur la liste ne puissent pas modifier quoi que ce soit (sauf si elle a le mdp) + que toutes personnes qui ne sont pas sur la liste, ne voit rien. Si A (qui est sur la liste) envoi le fichier à B (qui n'est pas sur la liste) qu'il en voit aucune ligne

Pouvez-vous m'aider svp
Merci d'avance

Private Sub Workbook_Open()

Worksheets("Stats 2018").Visible = 0 'masque le feuille Stats 2018
Worksheets("-").Visible = 0 'masque le feuille -
Worksheets("+").Visible = 0 'masque le feuille +
Worksheets("Feuil2").Visible = 0 'masque le feuille 2 qui contient la table de correspondance

ActiveSheet.Range("C:C").AutoFilter Field:=3, Operator:= _
xlFilterNoFill

'chercher l'initiale dans la table de correspondance (ici sur feuille 2)
nom = Application.UserName
initiales = Application.VLookup(nom, [utilisateurs], 2, False) ' table correspondance
If Not IsError(initiales) Then
Sheets(1).Cells.AutoFilter Field:=1, Criteria1:=initiales


'proteger la feuille avec mdp ici "marson" pour éviter que les personnes annulent le filtre de leur initiale
'Sheets(1).Protect Password:="marson"
End If
End Sub


2 réponses

fabien25000 Messages postés 673 Date d'inscription mercredi 5 octobre 2016 Statut Membre Dernière intervention 28 juillet 2022 58
Modifié le 15 nov. 2018 à 16:26
Bonjour
si tu veux que la feuille soit protégée en toute circonstance il faut mettre les lignes de code en dehors du if sinon effectivement la feuille ne se protège que si la condition est remplie

Private Sub Workbook_Open() 

Worksheets("Stats 2018").Visible = 0 'masque le feuille Stats 2018 
Worksheets("-").Visible = 0 'masque le feuille - 
Worksheets("+").Visible = 0 'masque le feuille + 
Worksheets("Feuil2").Visible = 0 'masque le feuille 2 qui contient la table de correspondance 

ActiveSheet.Range("C:C").AutoFilter Field:=3, Operator:= _ 
xlFilterNoFill 

'chercher l'initiale dans la table de correspondance (ici sur feuille 2) 
nom = Application.UserName 
initiales = Application.VLookup(nom, [utilisateurs], 2, False) ' table correspondance 
If Not IsError(initiales) Then 
    Sheets(1).Cells.AutoFilter Field:=1, Criteria1:=initiales 
End If 
 'proteger la feuille avec mdp ici "marson" pour éviter que les personnes annulent le filtre de leur initiale 
Sheets(1).Protect Password:="marson"
End Sub 


edit et surtout la ligne qui protége la feuille est en commentaire (chose que je n'avait pas vu en l'absence des balises de code)
0
AMO255 Messages postés 6 Date d'inscription jeudi 15 novembre 2018 Statut Membre Dernière intervention 20 novembre 2018
16 nov. 2018 à 08:28
Bonjour Fabien25000 et merci beaucoup pour ta réponse.

J'ai déplacé le End If.

J'ai eu un message d'erreur 1004, car il ne pouvait faire le codeActiveSheet.Range("C:C").AutoFilter Field:=3, Operator:= _
xlFilterNoFill car la feuille était protegée :o)

J'ai donc ajouté au début de mon code : Sheets(1).Unprotect Password:="marson" et ça fonctionne maintenant. Merci beaucoup

Et déplacement le Endi If ça règle également l'autre soucis que j'avais càd : si je ne suis pas sur la liste des autorisés je ne peux pas utiliser le fichier,

est-ce qu'il y a un code pour dire, si je ne suis pas sur la liste, je ne peux voir aucune ligne à l'ouverture du fichier ou éventuellement la ligne 3 sur laquelle j'ai écrit "vous n'êtes pas pilote Codir et n'avez pas accès au fichier" ?
Car si j'enregistre le fichier avec mes lignes et qu'il est envoyé à qqn (non autorisé) il ne pourra pas l'utiliser certe mais verra mes lignes.


Merci à toi
0
fabien25000 Messages postés 673 Date d'inscription mercredi 5 octobre 2016 Statut Membre Dernière intervention 28 juillet 2022 58
Modifié le 16 nov. 2018 à 09:48
Bonjour,
il te faut plusieurs choses pour faire ça :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
 'on rétabli à la fermeture
     ThisWorkbook.IsAddin = True
'et à la fin de ta macro : remettre raccourci clavier Ctrl Pause
    Application.EnableCancelKey = xlInterrupt 'Ou xlErrorHandler
End Sub

Private Sub Workbook_Open()

    Dim tmpmsgbx, i As Integer
    
'empêcher l'affichage d'un classeur s'il est ouvert alors que l'exécution
'des macros est désactivée dans les options de sécurité
    ThisWorkbook.IsAddin = False
''au début de ta macro
    Application.EnableCancelKey = xlDisabled 'empeche raccourci clavier Ctrl Pause
    
    Worksheets("Stats 2018").Visible = 0 'masque le feuille Stats 2018
    Worksheets("-").Visible = 0 'masque le feuille -
    Worksheets("+").Visible = 0 'masque le feuille +
    Worksheets("Feuil2").Visible = 0 'masque le feuille 2 qui contient la table de correspondance
    Sheets(1).Unprotect Password:="marson"
    ActiveSheet.Range("C:C").AutoFilter Field:=3, Operator:= _
    xlFilterNoFill
    
    'chercher l'initiale dans la table de correspondance (ici sur feuille 2)
    Nom = Application.UserName
    initiales = Application.VLookup(Nom, [utilisateurs], 2, False) ' table correspondance
    If Not IsError(initiales) Then
        Sheets(1).Cells.AutoFilter Field:=1, Criteria1:=initiales
    Else
        MsgBox "vous n'êtes pas pilote Codir et n'avez pas accès au fichier"
        ThisWorkbook.Close savechanges:=False
    End If
     'proteger la feuille avec mdp ici "marson" pour éviter que les personnes annulent le filtre de leur initiale
    Sheets(1).Protect Password:="marson"

End Sub


Code largement issu des conseils de cs_LePivert que je salue

0
AMO255 Messages postés 6 Date d'inscription jeudi 15 novembre 2018 Statut Membre Dernière intervention 20 novembre 2018
16 nov. 2018 à 10:24
Le code devient de plus en plus complexe, j'y lis des choses que j'ai jamais vu, comme le Ctrl Pause, mais toujours et encore merci pour ton aide, et à celle de cs_LePivert

J'ai ouvert le fichier, comme personne non autorisé, j'ai le msgbox qui s'ouvre avec le message "vous n'êtes pas autorisé...." quand je clique sur ok il ferme le fichier, c'est super MAIS avant de cliquer sur OK je vois les lignes du fichier, que je peux faire défilier avec la scroll. il execute bien le masquage des feuilles et le filtre sur la colonne mais je vois des lignes

j'ai copier/coller ton code tel quel dans ThisWorkBook. Je dois rien déplacé n'est-ce pas ?
Je demande ça à cause de ceci "'et à la fin de ta macro : remettre raccourci clavier Ctrl Pause
Application.EnableCancelKey = xlInterrupt 'Ou xlErrorHandler
"

il ne m'a pas demandé d'activer le contenu, est-ce pour ça ?
'empêcher l'affichage d'un classeur s'il est ouvert alors que l'exécution des macros est désactivée dans les options de sécurité

Désolé de ne pas mieux maîtriser ceci
0
AMO255 Messages postés 6 Date d'inscription jeudi 15 novembre 2018 Statut Membre Dernière intervention 20 novembre 2018
16 nov. 2018 à 10:47
pour contourner le problème, sur conseil d'une collegue j'ai ajouté un une feuille qui sera la feuille de garde.

Cette feuille dira "allez sur la feuille FCN"

résultat celui qui est autorisé pourra sélectionner la feuille FNC, celui qui n'est pas autorisé verra la msgbox et ne pourra pas sélectionner la feuille FCN

en attendant un code pour ça :o)
0
fabien25000 Messages postés 673 Date d'inscription mercredi 5 octobre 2016 Statut Membre Dernière intervention 28 juillet 2022 58
16 nov. 2018 à 10:53
pour la visibilité peut être peux tu créer une Feuille "accueil" et rajouter :
For Each Ws In Worksheets
    If Ws.Name <> "Accueil" Then Sheets(Ws.Name).Visible = xlSheetVeryHidden
Next Ws

avant la ligne de la msgbox

sans oublier de déclarer au début du code
    Dim Ws As Worksheet


pour le reste, non tu n'as rien à déplacer
et oui on force à passer par le code pour ouvrir le fichier sinon ça sert à rien de vouloir "sécuriser" tes feuilles en cas d'identifiant non valide
Après on est sur excel c'est fait pour contenir des secrets d'état ou des données de la banque de france..
0
AMO255 Messages postés 6 Date d'inscription jeudi 15 novembre 2018 Statut Membre Dernière intervention 20 novembre 2018
16 nov. 2018 à 11:00
Nos message se sont croisés, j'ai donc bien crée une feuille "Accueil"

Je te remercie sincerement de ton aide. Je vais marquer ma question comme résolu.

Encore merci et bon weekend à toi
0
fabien25000 Messages postés 673 Date d'inscription mercredi 5 octobre 2016 Statut Membre Dernière intervention 28 juillet 2022 58
16 nov. 2018 à 11:02
avec plaisir
0