VBA protection feuille aléatoire

Résolu
AMO255 Messages postés 6 Statut Membre -  
AMO255 Messages postés 6 Statut Membre -
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

  1. fabien25000 Messages postés 697 Statut Membre 59
     
    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
    1. AMO255 Messages postés 6 Statut Membre
       
      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
  2. fabien25000 Messages postés 697 Statut Membre 59
     
    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
    1. AMO255 Messages postés 6 Statut Membre
       
      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
    2. AMO255 Messages postés 6 Statut Membre
       
      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
    3. fabien25000 Messages postés 697 Statut Membre 59
       
      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
    4. AMO255 Messages postés 6 Statut Membre
       
      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
    5. fabien25000 Messages postés 697 Statut Membre 59
       
      avec plaisir
      0