Mot de passe feuille excel

Mot de passe feuille excel - VB/VBA/VBS - Programmation

Marsh Posté le 29-10-2009 à 12:19:42    

Bonjour,
est ce qu'il est possible de soumettre l'ouverture d'une feuille excel a une identification et un mot de passe? je m'explique, j'ai une application excel au sein de ma boite en réseau local. Cet application contient une feuille par salarié.(Total 15 feuilles). Je souhaiterais que chaque salarié ait accès uniquement à la feuille portant son nom et ceci par mot de passe.Les autres feuilles lui étant masquées. Étant complément novice en vba, est ce que vous pouvez me donner un coup de main.
Merci d'avance


---------------
jcds
Reply

Marsh Posté le 29-10-2009 à 12:19:42   

Reply

Marsh Posté le 29-10-2009 à 18:36:31    

Salut, via environ("USERNAME" ) qui te donnera le nom de login windows de l'utilisateur X , attention il existe en VBA un username qui ne donne que le nom donné lors de l'installation dans License d'utilisation accordée à . Via environ("USERNAME" ) tu peux donc sans mot de passe automatiser l'ouverture et n'afficher que la feuille concernant l'utilisateur X
Qqch comme cela , je n'ai plus de réseau de disponible pour le tester , donc à toi de l'adapter à ton contexte


Option Explicit
 
Dim sUser As String
 
Private Sub Workbook_Open()
Dim Ws As Worksheet, i As Long
    sUser = Environ("USERNAME" )
    Application.ScreenUpdating = False
 
    For Each Ws In ThisWorkbook.Worksheets
        If Ws.Name <> sUser Then
            Ws.Visible = xlVeryHidden
        Else
            Ws.Visible = xlSheetVisible
        End If
    Next Ws
 
    Application.ScreenUpdating = True
End Sub


 
Par la suite te renseigner sur CodeName dans le cas d'un changement malencontreux de nom d'onglet , cela te permet de ne pas retoucher au code VBA et d'affecter toujours la bonne feuille à l'utilisateur connecté


Private Sub Workbook_Open()
Dim Ws As Worksheet, i As Long
    sUser = Environ("USERNAME" )
    Application.ScreenUpdating = False
     
    On Error Resume Next
    For Each Ws In ThisWorkbook.Worksheets
        Select Case sUser
            Case "V"
                ShUser1.Visible = xlSheetVisible
            Case "X"
                ShUser2.Visible = xlSheetVisible
            Case "Y"
                ShUser3.Visible = xlSheetVisible
        End Select
        Ws.Visible = xlSheetVeryHidden
    Next Ws
    Application.ScreenUpdating = True
End Sub


 
Pour cela voir http://www.ozgrid.com/VBA/excel-vba-sheet-names.htm
http://www.cpearson.com/excel/codemods.htm


Message édité par kiki29 le 29-10-2009 à 19:37:18
Reply

Marsh Posté le 29-10-2009 à 22:26:50    

Merci Kiki de m'avoir répondu et proposé ce code.Je suis chez moi donc je ne peux l'essayer en réseau!!!! je te donne des nouvelle des demain. Par contre j ai oublié de mentionner un détail qui a une grande importance...outre le salarié qui doit avoir accès a son onglet, le responsable de service doit avoir accès a tout les onglets... j'espère que cela ne représente pas un grand chamboulement dans ton code... Merci d'avance

Reply

Marsh Posté le 29-10-2009 à 22:54:22    

Je reviens avec une petite idée...dis moi ce que tu en pense kiki...On pourrait mettre un mot de passe à l'ouverture du classeur.Si le mot de passe est correct, on a accès à tous les onglets... sinon on applique ton code... c'est a dire qu'à ce moment là, on a accès uniquement à l'onglet portant le nom du salarié authentifié....

Reply

Marsh Posté le 30-10-2009 à 06:21:14    

Salut, à tester


Option Explicit
 
Private Sub Workbook_Open()
Dim Ws As Worksheet, i As Long
Dim sUSer As String
    sUSer = Environ("USERNAME" )
    Application.ScreenUpdating = False
     
    On Error Resume Next
    For Each Ws In ThisWorkbook.Worksheets
        Select Case sUSer
            Case "Admin"
                ShUser1.Visible = xlSheetVisible
                ShUser2.Visible = xlSheetVisible
                ShUser3.Visible = xlSheetVisible
                Exit For
            Case "V"
                ShUser1.Visible = xlSheetVisible
            Case "X"
                ShUser2.Visible = xlSheetVisible
            Case "Y"
                ShUser3.Visible = xlSheetVisible
        End Select
        Ws.Visible = xlSheetVeryHidden
    Next Ws
    Application.ScreenUpdating = True
End Sub

Reply

Marsh Posté le 30-10-2009 à 11:49:58    

je te remercie kiki pour ta réactivité...Je viens d'essayer le code et des le premier case il me met "erreur de compilation variable inconnue" sur ShUser1. Je te joins ci après l'intégralité de mon code.
Sachant que mes onglets sont nommés  Dupont...Durant...Robert...Villiers
 
Encore une fois merci
 
 
 
Option Explicit
 
Private Sub Workbook_Open()
Dim Ws As Worksheet, i As Long
Dim sUSer As String
    sUSer = Environ("USERNAME" )
    Application.ScreenUpdating = False
     
    On Error Resume Next
    For Each Ws In ThisWorkbook.Worksheets
        Select Case sUSer
            Case "GAP1"
                DUPONT.Visible = xlSheetVisible
                DURANT.Visible = xlSheetVisible
                ROBERT.Visible = xlSheetVisible
    VILLIERS.Visible = xlSheetVisible
                Exit For
   Case "GAP2"
                DUPONT.Visible = xlSheetVisible
                DURANT.Visible = xlSheetVisible
                ROBERT.Visible = xlSheetVisible
    VILLIERS.Visible = xlSheetVisible
                Exit For
 
   Case "INFO"
                DUPONT.Visible = xlSheetVisible
                DURANT.Visible = xlSheetVisible
                ROBERT.Visible = xlSheetVisible
    VILLIERS.Visible = xlSheetVisible
                Exit For
 
            Case "DUPONT"
                DUPONT.Visible = xlSheetVisible
            Case "DURANT"
                DURANT.Visible = xlSheetVisible
            Case "ROBERT"
       ROBERT.Visible = xlSheetVisible
   Case "VILLIERS"
                VILLIERS.Visible = xlSheetVisible
   
        End Select
        Ws.Visible = xlSheetVeryHidden
    Next Ws
    Application.ScreenUpdating = True
End Sub
 
 
 

Reply

Marsh Posté le 30-10-2009 à 12:21:09    

Salut,c'est normal voir plus haut http://www.ozgrid.com/VBA/excel-vba-sheet-names.htm  
http://www.cpearson.com/excel/codemods.htm
sinon voir snapshot sur http://cjoint.com/?kEmuTCePEe
 
Autrement dit aller sous VBE ( Alt+F11 )
Afficher la Fenêtre Prorpiétés ( F4 )
Sélectionner DUPONT ( nom d'onglet ) par exemple
Dans la fenêtre Propriétés sélectionner (Name) et remplacer  
"FeuilXYZ" par ShUser1 etc
 
et je rajoute une couche http://cjoint.com/?kEmNY8MnGc


Message édité par kiki29 le 30-10-2009 à 12:40:16
Reply

Marsh Posté le 09-11-2009 à 10:17:06    

Cool ca marche Kiki... de retour de congés ce matin j'ai essayé et ca marche. Encore Merci!!!!!!! Je crois que je vais m y mettre serieux car on peut faire pas mal de choses!!!! Euh tout petit problème qd  la sécurité macro est très elevée, il n'excute pas la macro et ouvre au nom de la dernière personne ayant eu accès!!!  idem lorsque un nom de connexion ne possède pas d'onglet!!! Exemple si j'ouvre une connexion au nom de Durant et que Durant n'a pas d'onglet sur le fichier excel...il se connectera directement sur l'onglet du dernier ayant eu accès au fichier...Je ne sais pas tout ça est clair pour toi... Merci encore une fois

Reply

Marsh Posté le 09-11-2009 à 18:03:44    

Salut, je te propose cela : l'ajout d'une fonction qui vérifie l'existence de l'onglet et qui en cas de non existence de cet onglet avertit l'utilisateur et ferme l'application sans rien sauver
http://cjoint.com/?ljsGNROUWt
Juste une remarque : un classeur Excel de n feuilles doit en avoir au moins une de visible
 
Pour le niveau de sécurité il te faudra créer un certificat : voir http://vb.developpez.com/faqvba/?page=2#selfcert
http://www.developpez.net/forums/d [...] rtificats/


Message édité par kiki29 le 09-11-2009 à 20:56:40
Reply

Marsh Posté le 10-11-2009 à 09:35:30    

Ok. J'essaie et je te tiens au courant... Merci...Merci...Merci!!!!!!

Reply

Marsh Posté le 10-11-2009 à 09:35:30   

Reply

Marsh Posté le 10-11-2009 à 10:37:04    

Kiki...re... je viens d'essayer avec la fonction qui vérifie l'existence de l'onglet...à priori, il exécute le if et me sort de l'application à tous les coups même si l'onglet existe.

Reply

Marsh Posté le 10-11-2009 à 17:42:00    

Re, à tester http://cjoint.com/?lkrPfaiC12
Autant pour moi, trop pressé, il faut tenir compte des administrateurs qui eux n'ont pas d'onglets mais doivent avoir accès à ceux des utilisateurs n'est ce pas ?


    .....
    sUSer = Environ("USERNAME" )
 
    If sUSer <> "GAP1" And sUSer <> "GAP2" And sUSer <> "INFO" Then
        If FeuilleExiste(sUSer) = False Then
            MsgBox "Onglet inexistant : Contacter votre administrateur", vbOKOnly
            ThisWorkbook.Close False
            Exit Sub
        End If
    End If
    .....


Message édité par kiki29 le 10-11-2009 à 17:48:46
Reply

Marsh Posté le 08-12-2009 à 11:25:57    

Je reviens ici pour te dire Kiki que c'est bon...Ça marche. Désole de ne pas avoir donné de nouvelles plus tôt mais par manque de temps, je n'ai pas pu tester avant cette semaine. Encore merci pour ton aide très précieuse.

Reply

Marsh Posté le 09-12-2009 à 10:53:13    

Bonjour
 
Je n'ai pas tout regardé du développement qui me semble très intéressant, mais je voudrais soumettre une suggestion, ce serait de mettre en début de macro la ligne suivante, qui a pour effet d'empêcher l'interruption de la macro, volontaire ou non, et donc l'ouverture du module avec apparition du code.
 
Application.EnableCancelKey = xlDisabled  
 
Qu'en penses-tu, Kiki?
 
Cordialement


---------------
Olympus OM-D  EM-5 + 14-42
Reply

Marsh Posté le 09-12-2009 à 11:07:24    

Précision: Pour pouvoir observer et corriger un éventuel dysfonctionnement de la macro, cette formule n'est à activer que elle  fonctionne parfaitement.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed