XL 2016 Créer une INPUTBOX pour saisir un login et mot de passe en écriture ou choisir "lecture seule

C.PAGAGNÉ

XLDnaute Nouveau
Bonjour à tous,
Comme je suis novice, je m'excuse par avance si je m'exprime mal ou que je ne comprends pas les réponses données.
Je vais faire de mon mieux...
J'ai un fichier .xlsm avec déjà des codes que j'ai pioché lors de mes recherches qui se traduisent par :
Ouverture du fichier avec INPUTBOX demandant un login et un mot de passe. Ceux-ci sont dans l'une des feuilles avec une 3ème colonne pour leur donner accès à seulement un onglet affiché pour chacun. Un VIP avec son code à accès à tous les onglets affichés. pour tous ces cas, ils sont en lecture/écriture.
Par contre, le reste de la planète doivent être en lecture seule.
J'ai donc fait une MESSAGEBOX juste avant pour dire "si t'as un code, clique OUI" pour suivre à la INPUTBOX ou "si t'as pas de code, clique non" et je voudrais que ça passe en lecture seule DIRECTEMENT et surtout en ne passant pas par la INPUTBOX.
Hors après un bidouillage ça serait presque bon mais en lecture seule ça pose PB et j'arrive quand même au LOGIN...

Avez-vous des suggestions?
pour faire simple je peux joindre le code...

Merci d'avance
 
Solution
Bonjour @C.PAGAGNÉ , Bruno, Jean-Marie, le Forum

Quand tu écris :
voilà pourquoi chacun a un code perso pour écrire juste dans son onglet affiché.
Celà sous entend donc que chacun peut écrire (dans son/ses onglet(s) affiché(s) et que donc il a le droit de sauver ???


Quoiqu'il en soit je n'ai pas utilisé ton exemple, bien trop biscornu pour avoir une base de travail dans ma façon de développer (non pas que ça ne fonctionne pas ou bien que je critique, mais chacun ses propres habitudes et bases, et ce n'est pas trop mal pour un novice)

Dans l'exemple ci-joint, il y a une table "SETUP" qui contient tout :
1599997601498.png


Le "ReadOnly" est gérable par utilisateur avec cette table, tu peux ajouter des users, le...
C

Compte Supprimé 979

Guest
Bonjour,

Le seul moyen de le faire à mes yeux, c'est de faire avec ton fichier -> Enregistrer sous
Là tu vas dans le bouton "Outils" -> Options générales
2020-09-12_19h21_23.png


Tu saisi un mot de passe pour la modification
2020-09-12_19h23_24.png


Come cela, à l'ouverture tu as le message
2020-09-12_19h24_22.png


La suite est gérée par ton code VBA ;-)

@+
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour @C.PAGAGNÉ , @BrunoM45 , le Forum

Je suis d'accord avec Bruno, à ma connaissance, c'est le "Out of the Box" standard d'Excel de sauver le classeur avec cette méthode "Modify" password, sinon "ReadOnly". (le plus fiable aussi)

Il y a aussi une autre approche mais qui sent le gaz et ne sera pas fiable pour les petits malins, c'est de créer un autre classeur "d'interface d'ouverture" qui ouvrira ce fameux classeur en fonction de qui a le droit avec ta table des droits d'accès et qui lancerait de genre de code :

VB:
Sub OpenWorkbook()
    Dim WB As Workbook
    Dim ThePath As String

    ThePath = "C:\BlahBlah\LeFameuxClasseur.xlsx"
    Set WB = Workbooks.Open(Filename:=ThePath, ReadOnly:=True)

End Sub


Une autre approche encore serait de s'appuyer sur la Macro évènementielle dans "ThisWorkBook" directement dans le fameux classeur et de faire en sorte que ton algo existant de contrôle d'accès coïncide avec ce "Trigger" :

VB:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Cancel = TheBooleanFromAccessControl '(True or False), si faux on ne sauve pas ...

End Sub

Il faut que la variable TheBooleanFromAccessControl soit déclarée "Public" en top de Module Standard et initialisée à True quand les "VIP" s'authentifient...

Bon courage
@+Thierry
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re bonsoir à tous

En revenant sur ce fil avec le "like" de Bruno (merci), j'ai pensé aussi à quelque chose de plus "pro"aussi si, ton fameux classeur se trouve sur un réseau Windows, tu peux aussi voir du côté de la Propriété Sécurité des autorisations par utilisateurs pour affiner les droits en Lecture uniquement.

Il faut être Administrateur pour faire ceci, mais on peut "jouer" par Répertoires, et même au niveau fin, par fichiers...
(Click Droit depuis l'explorateur de fichiers => Propriétés)

Bonne soirée
@+Thierry
 

C.PAGAGNÉ

XLDnaute Nouveau
bonjour à tous,

Tout d'abord, merci pour vos réponses.

@Bruno : j'avais commencé comme ça et c'était pas mal mais ceux qui avaient le code central basculaient sur l'INPUTBOX pour leurs codes individuels (donc nickel !).
Mais c'est pour ceux qui cliquaient sur LECTURE SEULE, ils passaient quand même par la case INPUTBOX...(donc pas bon).
Je ne sais pas comment esquiver et ouvrir directement le fichier en lecture seule avec tous les onglets...
@thierry : désolé je n'ai pas tout suivi...
Et pour le réseau, c'est un "entreprise", et je ne suis pas du tout administrateur (et ce n'est pas possible)
J'ai des fichiers de saisie avec d'autres collègues ou services pour que j'en conserve centralisés dans le mien (mais c'est uniquement démerde totale...)
voilà pourquoi chacun a un code perso pour écrire juste dans son onglet affiché.

je prépare un poste avec le code complet, vous y verrez plus clair...
@+
 

C.PAGAGNÉ

XLDnaute Nouveau
RE,

Je vous met le code version initiale avec la proposition de BRUNO en amont.

VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'on affiche la feuille ACCEUIL
    Sheets("ACCEUIL").Visible = True
'on planque toutes les autres feuilles sauf Vierge
    For x = 1 To ThisWorkbook.Sheets.Count
        If Sheets(x).Name <> "ACCEUIL" Then Sheets(x).Visible = xlSheetVeryHidden
    Next

End Sub
Private Sub Workbook_Open()
    On Error Resume Next
    Application.ScreenUpdating = False
'on defini un pointeur
    Pointeur = 0
   
'on affiche la feuille ACCEUIL
    Sheets("ACCEUIL").Visible = True
'on va dessus
    Sheets("ACCEUIL").Activate
'on planque toutes les autres
    For x = 1 To ThisWorkbook.Sheets.Count
        If Sheets(x).Name <> "ACCEUIL" Then Sheets(x).Visible = xlSheetVeryHidden
    Next

'on saisit le user
    User = InputBox("Veuillez saisir votre nom d'utilisateur", "Utilisateur")
'on saisit le mot de passe
    MDP = InputBox("Veuillez saisir votre mot de passe", "Mot de passe")
 
'Derniere ligne du tableau de la feuille DroitsUsers pour boucler dessus
    DerLigne = Sheets("DROITS").Range("A65536").End(xlUp).Row
 
'on boucle pour trouver les occurences, x=2 car je pars du principe que la premiere ligne _
contient les entetes de colonne
    For x = 2 To DerLigne
'si ce qu'il y a dans la colonne1 (Colonne A : user) = le user saisi _
ET ce qu'il y a dans la colonne2 (Colonne B : mot de passe)
        If Worksheets("DROITS").Cells(x, 1) = User And Worksheets("DROITS").Cells(x, 2) = MDP Then
'on affiche la feuille définié en colonne3 (Colonne C : Onglet autorisé)
'on affiche la feuille correspondante
            FeuilleVisible = Worksheets("DROITS").Cells(x, 3)
            Sheets(FeuilleVisible).Visible = True
'on va dessus
            Sheets(FeuilleVisible).Activate
'on se met un pointeur pour voir si on trouve quelque chose, si on trouve rien on quittera
            Pointeur = Pointeur + 1

ElseIf User = "VIP" And MDP = "MDPVIP" Then
        For w = 1 To ThisWorkbook.Sheets.Count
             If Sheets(w).Name <> "ACCEUIL" Then Sheets(w).Visible = True
        Next
        Application.ScreenUpdating = True
        Exit Sub


    Next x

'Si le pointeur est 0 on ferme le fichier.
    If Pointeur = 0 Then
        MsgBox "Utilisateur ou mot de passe non valide" & vbCrLf & vbCrLf & "Le fichier va se fermer", vbCritical + vbOKOnly, "Sécurité"
        ActiveWorkbook.Close SaveChanges:=False
    End If

'on planque la feuille Vierge
    Sheets("ACCEUIL").Visible = 2

    Application.ScreenUpdating = True
 
End Sub

faudrait m'aider pour la partie lecture seule (code et position).
Merci d'avance.

@+
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour @C.PAGAGNÉ , Bruno, Jean-Marie, le Forum

Quand tu écris :
voilà pourquoi chacun a un code perso pour écrire juste dans son onglet affiché.
Celà sous entend donc que chacun peut écrire (dans son/ses onglet(s) affiché(s) et que donc il a le droit de sauver ???


Quoiqu'il en soit je n'ai pas utilisé ton exemple, bien trop biscornu pour avoir une base de travail dans ma façon de développer (non pas que ça ne fonctionne pas ou bien que je critique, mais chacun ses propres habitudes et bases, et ce n'est pas trop mal pour un novice)

Dans l'exemple ci-joint, il y a une table "SETUP" qui contient tout :
1599997601498.png


Le "ReadOnly" est gérable par utilisateur avec cette table, tu peux ajouter des users, le VBA qui construit la ListBox est dynamique sur la colonne "A" et à condition que les autres colonnes soient remplies. (pas de gestion d'erreur dans cette version ni de mauvais mot de passe, pour le moment...)

Ce n'est juste qu'un "POC" (Proof of Concept) pour montrer ma théorie exposée dans mon Post #3.

Pour la partie :
Et pour le réseau, c'est un "entreprise", et je ne suis pas du tout administrateur (et ce n'est pas possible)
J'ai des fichiers de saisie avec d'autres collègues ou services pour que j'en conserve centralisés dans le mien (mais c'est uniquement démerde totale...)
C'est bien triste de lire ceci, mais je sais que trop souvent dans les entreprises il y a un fossé infranchissable entre les utilisateurs avancés et les administrateurs réseau, et c'est bien dommage car tout le monde devrait travailler main dans la main, bien sûr ne pas te donner les droits d'administrateurs des disques, mais au moins affiner les droits comme il faut pour ton cas (et en prime ce serait plus "secure" que de ré-inventer la roue, mais bon !)

Bien à toi, à vous
@+Thierry
 

Pièces jointes

  • XLD_C.PAGAGNE_Protected_Workbook_ReadOnly_v00.xlsm
    26.1 KB · Affichages: 35

Discussions similaires

Réponses
2
Affichages
113

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 846
dernier inscrit
Silhabib