IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Classeur en Ecriture en fonction du UserName


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 664
    Par défaut Classeur en Ecriture en fonction du UserName
    Bonjour,

    Afin d'éviter, à des utilisateurs ciblés, la saisie d'un mot de passe pour pouvoir modifier un classeur, est-il possible d'utiliser la propriété application.username en ajoutant les "identifiants" dans Private Sub Workbook_Open() (avec le code qui va bien, bien sûr...) ?

    En vous remerciant par avance pour vos lumières?
    Cordialement,
    jp

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonsoir JP,

    Oui c'est tout à fait possible,

    Une bonne méthodologie est donnée par Menhir dans ce post

    https://www.developpez.net/forums/d2.../#post11592884

    Pour ce qui est des users autoriséd directement à l'ouverture, je travaillerais avec une liste, tableau listobject, qui contiendrait le nom des users autorisés ( sans mdp), et pour les autres re direction vers un Inputbox.

    Pour ce qui est de récupérer le user name.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Function GetUserName() As String
        GetUserName = Environ$("username") 
        'or
        'GetUserName = Application.UserName
    End Function
    Une bcl dans le Workbook_Open, qui vérifie si correspondance avec la table des accès.
    Ne pas oublier de re protéger à la sortie du classeur.

    Bat,
    MFoxy

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 664
    Par défaut
    Bonsoir,

    Merci pour cette réponse rapide.

    Le lien ne m'a pas beaucoup éclairé.

    La récupération de l'identifiant par application.username est à ma portée mais je ne sais pas trop comment créer une boucle autour des identifiants que j'aurais ajoutés dans le Workbook_open.

    Et une fois que la boucle révèle que le "user en cours" fait partie de la liste des personnes autorisées à écrire sur le fichier, comment rendre le classeur modifiable (ou non modifiable pour les autres users non autorisés) ?
    J'ai déjà utilisé une ligne de code pour savoir si un classeur est en "lecture seule" ou en "lecture/écriture" mais je ne sais pas comment faire rendre un classeur modifiable ou pas, à partir du code VBA.

    Cordialement,
    jp

  4. #4
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Voici un code que j'utilise pour autoriser certains utilisateurs et pas d'autres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Workbook_Open()
    Const UTIL1 As String = "PRENOM1.NOM1"
    Const UTIL2 As String = "PRENOM2.NOM2"
    Const UTIL3 As String = "PRENOM3.NOM3"
        Select Case Environ("username")
            Case UTIL1, UTIL2, UTIL3
                ' UNPROTECT
            Case Else
                ' PROTECT
        End Select
    End Sub
    L'inconvénient est que tu dois, pour autoriser un nouvel utilisateur, retourner dans le code.
    A voir donc selon l'utilisation.

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 664
    Par défaut
    Bonjour et merci Franck,

    Donc la boucle était une mauvaise idée. Effectivement, ce code me parle davantage. Je teste dès que possible.
    Dans un premier temps, il faut que je récupère les "identifiants" des utilisateurs en faisant tourner un classeur avec quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Columns("A").Find(Empty).Activate
    ActiveCell.Value = Application.UserName
    A bientôt,
    jp

  6. #6
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Dans un premier temps, il faut que je récupère les "identifiants" des utilisateurs
    Oui, en effet, ce sera mieux de les avoir avant de distribuer le fichier

    Mais pas besoin de macro pour cela. Tu le demandes à qui de droit... Qui va utiliser le fichier et avec quels droits?

    Une fois cette récolte d'infos réalisée, tu inscris les noms des utilisateurs en colonne A d'une feuille que tu masqueras, et, en colonne B, le niveau d'accès souhaité.
    En passant par une feuille, tu n'auras plus à farfouiller dans le code.

    Le code deviendrait donc, à la place de celui que je t'ai transmis précédemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub Workbook_Open()
    Dim rngUtilis As Range
        With Worksheets("NomFeuilMasquee")
            Set rngUtilis = .Columns(1).Find(Environ("username"))
            If Not rngUtilis Is Nothing Then
                Select Case rngUtilis.Offset(0, 1).Value 'Ici, on va scruter la colonne B de la feuille masquée si le nom est trouvé col A
                    Case "ALL"
                        ' UNPROTECT ALL
                    Case "PARTIEL"
                        ' UNPROTECT PARTIEL
                    Case Else
                        ' PROTECT ALL
                End Select
            Else
                MsgBox "Vous n'avez aucun droit d'accès. Veuillez vous renseigner auprès de l'administrateur de ce fichier.", vbOKOnly + vbCritical, "FERMETURE DU FICHIER !"
                ThisWorkbook.Close False
            End If
        End With
    End Sub
    Si tu as peur que ta feuille masquée soit "démasquée", tu peux passer :
    1- Par des noms masqués
    Suffit de créer un nom, dans le gestionnaire de noms du classeur, pour chaque utilisateur, et placer les droits dans le "RefersTo" de ce nom.
    Exemple de code qui retourne la valeur du RefersTo d'un nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function RenvoiRefersTo(Nom As String)
        RenvoiRefersTo = Names(Nom).RefersTo
    End Sub
    Pour masquer un nom dans le gestionnaire de noms :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub CacheNom(NomACacher As String)
    Dim nNom As Name
    For Each nNom In ThisWorkbook.Names
           If nNom.Name = NomACacher Then nNom.Visible = False
    Next nNom
    End Sub
    2- Par un fichier externe.

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 664
    Par défaut
    Bonjour Franck,

    Merci infiniment ; cela répond parfaitement à mes attentes (et testé avec succès).

    La première partie du code est tout à fait claire.

    S'agissant de la protection de la feuille (déjà VeryHidden), elle sert principalement à protéger l'utilisateur d'une fausse manip.

    L'utilisation de Noms, a fortiori masqués, est un peu trop compliquée pour moi et le mieux étant l'ennemi du bien, je vais m'en tenir pour l'instant à la première proposition.

    Merci encore !
    Cordialement,
    jp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Griser certaines couleurs de remplissage en fonction du username
    Par graphikris dans le forum Macros et VBA Excel
    Réponses: 62
    Dernier message: 06/08/2013, 21h01
  2. Ouverture classeur : empêcher calcul automatique fonction personnalisée
    Par boubou_s dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/01/2011, 14h46
  3. Ecriture de fonctions
    Par NFHnv dans le forum POSIX
    Réponses: 2
    Dernier message: 23/04/2009, 19h05
  4. ecriture de fonctions
    Par stoyak dans le forum Langage
    Réponses: 2
    Dernier message: 28/06/2006, 22h09
  5. ecriture de fonction
    Par madison59 dans le forum C++Builder
    Réponses: 6
    Dernier message: 01/02/2004, 00h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo