protection lecture et écriture

grodep

XLDnaute Occasionnel
bonjour à tous, je viens aujourd'hui vers vous pour un problème un peu particulier:
soit la population A (A1, A2,...An) et la population B(B1,...Bn)
Chaque individu A dispose d'un classeur excel qui lui est propre: CA1, CA2,..CAn.
Je souhaite que tous ces classeurs soient modifiables par n'importe quel B, mais qu'ils ne soient modifiables par aucun A.
Par ailleurs, je souhaite que chaque classeur CAn soit consultable par An et par aucun autre A.

L'option de protection par lecture/écriture n'est pas satisfaisante: si je mets un mdp pour la lecture et un autre pour l'écriture, il faut dans tous les cas que chaque individu B connaisse le mdp pour l'écriture (très bien, je peux mettre le même mdp pour l'écriture sur tous les fichiers) mais il faut aussi (et c'est pour moi complètement illogique) qu'il connaisse le mdp de lecture: je ne veux pas que ce mdp soit le même pour tous, sinon autant ne pas mettre de mdp!
D'ou mon souci: comment faire, si c'est possible, pour attribuer un mdp personnalisé de lecture pour chaque A, et un mdp général de modification pour l'ensemble des B?
Merci à tous de vos avis et conseils futurs.
 

poulpor78

XLDnaute Junior
Re : protection lecture et écriture

Bonjour,

Je ne pense pas qu'il soit possible d'avoir des mdp personnalisés. Par contre, si tu connais le vba, il existe des solutions, en supposant que vous travaillez en réseau et que tes populations ont accès à un même domaine (classique en entreprise).

Dans ce cas, il est possible de créer une base de données (moi j'ai fait cela en access) où on stocke dans une table les noms d'utilisateurs de session et les types d’accès (lecture seule ou écriture). Il faut que les utilisateurs aient accès à cet endroit pour que cela marche.

Dans le classeur, on va créer au préalable une feuille où il est écrit qu'on doit accepter les macros pour faire fonctionner ce classeur.

Sur l'ouverture du classeur :
- on tombe sur cette feuille
- on oblige à utiliser vba (les autres feuilles sont masquées avec la propriété veryhidden et on ne fait apparaître les autres feuilles de classeur que si on accepte les macros et qu'on fait parti des users reconnus dans la liste)
- dans le cas où on a accès, on masque la feuille ajoutée
- on enlève la protection par code des feuilles de travail si on est en lecture-écriture

Sur Fermeture du classeur :
- on reprotège les feuilles
- on masque en veryhidden tous les onglets sauf un où il est écrit qu'on doit accepter les macros pour faire fonctionner ce classeur

Donc par ce biais, les utilisateurs n'ont pas à connaître le mot de passe qui est caché dans le code vba, (code qu'on peut également protégé).

Si cela te semble jouable, je veux bien te donner des bouts de code permettant de reconnaître un user, de masquer/montrer des feuilles, de protéger/déprotéger une feuille.


Poulpor
 

grodep

XLDnaute Occasionnel
Re : protection lecture et écriture

Bonjour et merci de la rapidité de ta réponse.
La solution que tu proposes me semble parfaitement adaptée au contexte et j'apprécierai donc grandement ton aide: Est-il possible de répertorier les utilisateurs dans un fichier excel plutôt qu'un fichier access qui, s'il est plus adapté, ne bénéficie pas d'autant de "fans" capables de s'en servir?
N'y a t'il pas de risques de perturbations si plusieurs utilisateurs sollicitent en même temps le fichier "source" contenant le listing des accès?
Je serai très heureux de récupérer des bouts de code et d'exemples pour m'essayer ensuite à leur application sur mes fichiers.

Merci d'avance.
 

poulpor78

XLDnaute Junior
Re : protection lecture et écriture

Bonjour Grodep,

Concernant Access, les utilisateurs ne le voit jamais, puisque c'est vba qui va interroger Access. Pour ce qui est des risques d'héberger dans excel quand deux utilisateurs vont interroger le fichier...ben j'en sais rien, je laisserai bien répondre d'autres personnes qui ont de l'expérience dans ce domaine.


Je te donne mes codes en vrac (oui, je n'ai pas mis de commentaires :p):

1/ Sur ouverture du classeur, on va masquer la feuille d'entête (elle se nomme MYCODE ici) et on va montrer les autres feuilles du fichier

Code:
Private Sub Workbook_Open()
    For i = 1 To ActiveWorkbook.Sheets.Count
        If ActiveWorkbook.Sheets(i).Name = "MYCODE" Then
            ActiveWorkbook.Sheets(i).Visible = xlVeryHidden
        Else
            ActiveWorkbook.Sheets(i).Visible = True
        End If
    Next
    ActiveWorkbook.Sheets("MAIN").Select
End Sub


2/ Sur Fermeture du fichier, on aura donc :

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    INTERNAL.LoadPassword
    ActiveWorkbook.Unprotect (MyPassword)
    For i = 1 To ActiveWorkbook.Sheets.Count
        ActiveWorkbook.Sheets("MYCODE").Visible = True
        If ActiveWorkbook.Sheets(i).Name <> "MYCODE" Then
            ActiveWorkbook.Sheets(i).Visible = xlVeryHidden
        Else
            ActiveWorkbook.Sheets(i).Visible = True
        End If
    Next
    ActiveWorkbook.Protect (MyPassword)
End Sub

où INTERNAL.Loadpassword est une fonction dans le module renommé 'INTERNAL' permettant de charger le password :

Code:
Public MyPassword As String
Function LoadPassword()
    MyPassword = "Password"
End Function

J'utilise le même password pour les protections de feuilles et de classeurs.

Poulpor
 

poulpor78

XLDnaute Junior
Re : protection lecture et écriture

Re,

Je continue.

Tu pourras remarquer que je n'ai pas encore abordé la vérification du user. Je m'aperçois d'ailleurs que je laisse entrer le user même s'il n'est pas dans la liste. Personnellement je le bloque dés qu'il veut agir sur le fichier. La raison est que je souhaite pouvoir entrer dans le fichier pour débugguer si ça foire !

Ma vérification du user est la suivante :


Code:
Function Check_User() As Boolean


    Dim MYSELLERID As Long    'Identifiant du commercial
    Dim Mysql As String    'chaine sql
    Dim MyUserName As String    'Nom de connection NT
    Dim fso As Object    'objet Local
    Dim Response    ' boite de dialogue

    Check_User = False

'1/
    Dim MyObject As Object
    'Récupération du nom d'utilsateur NT
    Set MyObject = CreateObject("WScript.NetWork")
    MyUserName = MyObject.UserName

'2/
    'Chargement du path de la BDD
    INTERNAL.MyPath

'3/
    'Test de connection à la BDD
    Set fso = CreateObject("Scripting.FileSystemObject")
    If Not (fso.FileExists(Mdbsource)) Then
        Response = MsgBox("Connection to Datasource Failed", vbOKOnly + vbExclamation, "STOP", "", 1000)
        Exit Function
    End If

    Application.Calculate

'4/
    MYSELLERID = Sheets("MAIN").Cells(4, 7).Value

'5/
    Dim BaseSource As ADODB.Connection
   Set BaseSource = New ADODB.Connection
   BaseSource.Mode = adModeReadWrite
   
       Dim strConn As String
    
      If BaseSource.State = adStateClosed Then
         strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Mdbsource & ";Persist Security Info=False;"
         BaseSource.ConnectionString = strConn
         BaseSource.Open
      End If

    Mysql = "SELECT T_USERS.USER_NAME, T_RIGHTSUPDATE.RIGHTU_IDSELLER FROM T_USERS INNER JOIN T_RIGHTSUPDATE ON T_USERS.ID_USER = T_RIGHTSUPDATE.RIGHTSU_IDUSER"
    Mysql = Mysql & " " & "WHERE T_USERS.USER_NAME=""" & MyUserName & """ AND T_RIGHTSUPDATE.RIGHTU_IDSELLER=" & MYSELLERID & ";"


  Dim MySelection As ADODB.Recordset
   
    With BaseSource
        Set MySelection = .Execute(Mysql)
    End With

'6/
    If MySelection.RecordCount <> 0 Then Check_User = True

    MySelection.Close
    Set MySelection = Nothing
    BaseSource.Close
    Set BaseSource = Nothing

End Function


Bon, là il y a plusieurs notions mélangées. C'est une fonction booléenne où la réponse est soit vrai soit faux.

L'ossature du code :
1/ Je récupère le nom d'utilisateur de session
2/ Je récupère le path de ma base access (fonction similaire à celle du chargement de password)
3/ Je teste que le user a accès à cette base (s'il n'est pas en réseau, s'il n'a pas les droits)
4/ Je récupère l'identifiant du fichier SELLERID car dan mon cas, un fichier peut être utilisé par un ou plusieurs users pourvu que ce user soit déclaré dans ma base
5/ Je crée un connexion vers access, lance une requête pour savoir si le user a le droit de modifier SELLERID
6/ Si ça retourne une réponse, c'est qu'il a les droits.

Dans ton cas, les points 4, 5 et 6 pourront être remplacés par un test vers un fichier excel où tu auras ta table.
 

poulpor78

XLDnaute Junior
Re : protection lecture et écriture

Bilan : je t'ai donné mes codes exemples mais ils sont à adapter.

Par exemple, la vérification du user doit être utilisé dans Private Sub Workbook_Open()

De même, la stratégie de protection n'est pas la même. Elle est à adapter.

Mais avec ces codes, tu as tout ce qu'il te faut. La seule chose à aller chercher pour que ce soit plus simple : comment aller chercher une valeur dans une liste excel, classeur fermé. Tu peux par exemple aller voir de ce coté : Lire et crire dans les classeurs Excel ferms

Poulpor
 

Discussions similaires

Réponses
12
Affichages
465

Membres actuellement en ligne

Statistiques des forums

Discussions
312 329
Messages
2 087 334
Membres
103 520
dernier inscrit
Azise