Ouvrir un fichier Excel en fonction d'une session Windows
Bonjour à toutes et tous,
Je vous prie de m'excuser pour le caractère novice de cette question en excel et je souhaiterais me perfectionner.
Je vous sollicite pour une petite question VBA : Est-il possible d'accorder l'ouverture d'un fichier excel en fonction d'un session Windows ?
Existe-t-il un code VBA qui analyse le nom de la session windows et qui autorise l'ouverture de ce même fichier excel ?
Pour précisions nous ne souhaitons pas de mot de passe, ni de lecture seule, ni encore la fonction "protéger le classeur" de excel !
Je vous remercie toutes et tous pour vos réponses et vos aides !
Bonjour et bienvenue sur ce forum
Je vous sollicite pour une petite question VBA : Est-il possible d'accorder l'ouverture d'un fichier excel en fonction d'un session Windows ?
Quand vous parlez de session Windows, vous pensez à l'accès d'un fichier par un utilisateur ?
Cordialement
Bonjour,
Pour ouvrir un fichier au démarrage de Windows il suffit de mettre son raccourci dans le dossier Startup de l'utilisateur en question. Cf. Configurer des applications de démarrage dans Windows - Support Microsoft (au lieu de l'application on utilise le raccourci du fichier – méthode explorateur windows)
Donc pour chaque utilisateur il faut faire cette manip avec chacun des fichiers puis vous serez bon. Pas besoin de VBA.
Si vous avez beaucoup d'utilisateurs et de fichiers à c/c, c'est plutôt PowerShell que VBA qu'il faudrait utiliser pour c/c les classeurs/raccourcis automatiquement. Mais bon c'est du travail d'administration PC, qui n'a aucun lien avec Excel.
Bonjour saboh12617,
Je ne pense que c'est ce soit le sujet de la demande. --> Est-il possible d'accorder l'ouverture d'un fichier excel en fonction d'un session Windows ?
Pour moi il s'agit de l'accès au fichier par certains utilisateurs et non tous
Mais bon je vous laisse continuer avec cette demande
A+
Bonjour @Dan,
Vous avez raison j'ai lu trop vite (à partir du titre). Ma précédente réponse ne convient pas.
Pour moi ce que demande l'op n'est pas impossible techniquement. On peut, dans l'event Workbook.Open retrouver le nom de l'utilisateur ouvrant un fichier, et le comparer à une liste, puis, si il ne convient pas, lancer Workbook.Close pour refermer le fichier.
Mais il suffit qu'un utilisateur ait désactivé l'exécution des macros et c'est perdu. Ce n'est absolument pas fiable, d'autant que de plus en plus (et avec raison) les exécutions de macros sont restreintes.
Donc d'un point de vue applicatif, je trouve cela impossible. Pourquoi ne pas avoir 1 fichier/utilisateur tout simplement ?
re @saboh12617
Mais il suffit qu'un utilisateur ait désactivé l'exécution des macros et c'est perdu. Ce n'est absolument pas fiable, d'autant que de plus en plus (et avec raison) les exécutions de macros sont restreintes.
Il suffit de masquer toutes les feuilles sauf une qui reste vierge.
A l'ouverture du fichier, excel ne montre que cette feuille qui lui indique qu'il doit activer les macros pour utiliser le fichier.
Concernant les utilisateurs c'est tout à fait possible de définir qui a les droits d'utilisation.
Pourquoi ne pas avoir 1 fichier/utilisateur tout simplement ?
Pour avoir fait cela au boulot, j'avais un unique fichier modifiable par 3 personnes et consultable par les autres qui avait accès en lecture uniquement.
Il faut que le demandeur donne plus de précisions à mon avis
Bonjour à tous !
Avec le niveau de compréhension du fonctionnement des fichiers Excel de mes collègues, j'ai pu mettre sur le réseau un fichier qui ne peut s'ouvrir que par "deux" personnes, celui-ci est considéré comme étant l'original. Il embarque un code VBA qui masque toutes les feuilles à la fermeture sauf une où il est indiqué que la mise en route des macros est nécessaire pour son utilisation. Une fois les macros activées, comme vous le dites il y a un code qui le ferme si le user n'est pas le bon.
Ce fichier source est copié en fichier de consultation à chaque fermeture, comme cela le moindre novice qui a besoin d'en connaitre peut l'ouvrir, le modifier, le supprimer, cela n'affecte pas le fichier source.
Quand je vois avec qui je travaille... Cette solution "simple" nous permet d'être serein sur le devenir des données "sources", cela n'évite pas une suppression pur et simple de ce fichier, mais cela évite des erreurs de manipulations...
Ensuite, sans parler de UserName, j'ai écris un code qui ferme le fichier si un fichier "particulier" ne se trouve pas à un endroit "particulier" : exemple un fichier sur une clé USB de type LRD.Dat par exemple, le fichier Excel s'ouvre, recherche ce fichier sur le port USB de l'ordinateur, s'il ne le trouve pas alors il se coupe.
Bien sur ce n'est que des barrières de protections simple pour des utilisateurs standard, aucune protection fiable contre des hacker !
@ bientôt
LouReeD
Voici le "open" :
Private Sub Workbook_Open()
' on stope les messages d'alerte
Application.DisplayAlerts = False
' si le fichier est ouvert par une personne étrangère à nous et que le fichier s'appelle "Suivi original"
' on passe la variable Accès à Vrai et on quitte l'application
If Application.UserName <> "CPourNous" And ThisWorkbook.Name = "Suivi Original.xlsm" Then Accès = True: Application.Quit
' on stoppe la mise à jour de l'écran
Application.ScreenUpdating = False
' on arrête la surveillance événementielle
Application.EnableEvents = False
' on affiche toutes les feuilles
For i = IIf(Application.UserName = "CPourNous", 2, 3) To Worksheets.Count
Sheets(i).Visible = -1
Next i
' on masque la feuille d'activation des macros
Sheets(1).Visible = 2
' on active la feuille 25
Feuil25.Activate
End Suboù "CPourNous" est le nom de la version d'Excel et non pas du UserName de session, mais le principe est le même.
@ bientôt
LouReeD
Ci dessous des procédures pour vérifier la présence d'un fichier particulier sur la racine des différents disques connectés à l'ordinateur :
Sub Test_Existe()
Dim Fichier, S, Tablo, I
' on va chercher les lecteurs présent
S = TrouveLecteur
' on récupère chaque lettre de disque
Tablo = Split(S, ";")
' s'il y a au moins un disque
If Len(S) > 0 Then
' on boucle sur les lecteurs afin de trouver le fichier
For I = 1 To UBound(Tablo)
' on test si le dossier/fichier existe avec le lecteur en cours de test
If DossierExiste("" & Tablo(I - 1) & ":\LRD.dat") Then
' si le fichier existe on le signale
MsgBox ("Le fichier existe sur : " & Tablo(I - 1))
' le code peut être un démasquage de feuille car il y a habilitation à en connaitre
' on quitte prématurément car on a trouvé au moins une fois "la clé"
Exit Sub
Else
' le fichier n'existe pas sur ce lecteur, on continue la boucle
MsgBox ("Le fichier n'existe pas sur : " & Tablo(I - 1))
End If
Next I
' si on arrive ici c'est que le fichier n'existe sur aucun lecteur
' on n'est pas habilité
' on quitte le fichier, ici les lignes sont en commentaire
' afin d'accéder au fichier lors de la conception...
' Application.DisplayAlerts = False
' Application.Quit
Else
' ici on ne devrait pas y passer car il y a au moins un lecteur me semble-t-il.
MsgBox ("Pas de lecteur disque détecté...")
End If
End Sub
Function TrouveLecteur()
Dim Tmp, Fs, D
Set Fs = CreateObject("Scripting.FileSystemObject")
Tmp = ""
' on boucle sur les lecteurs
For Each D In Fs.Drives
' pour info
' 0 = "Unknown"
' 1 = "Removable"
' 2 = "Fixed"
' 3 = "Network"
' 4 = "CD-ROM"
' 5 = "RAM Disk"
' si le lecteur est "OK" alors Tmp prend pour valeur sa valeur + la lettre du lecteur
If D.IsReady Then Tmp = Tmp & D.DriveLetter & ";"
Next
' on retourne la valeur de Tmp
TrouveLecteur = Tmp
End Function
Function DossierExiste(NomDossier As String) As Boolean
' on vérifie que le chemin+nomfichier existe
DossierExiste = Dir(NomDossier, vbSystem + vbDirectory + vbHidden) <> ""
End FunctionVous l'aurez compris, le fichier LRD.dat n'est autre qu'un document texte vide qui a été renommé avec ce nom et cette extension, rien de plus.
Mais ceci dit, une fois le fichier trouvé, on pourrait lire ce qu'il y a dedans afin de savoir exactement quoi faire du fichier...
@ bientôt
LouReeD
Un vrai programmeur aurait mis le code d'ArkaLooReed dans LRD.dat et l'aurait émulé pour valider une entrée utilisateur. Dommage…
J'attends la suite !
Sinon le fichier avec la feuille "Activez les macros", le MDP est LRD :
Donc je me suis fait un fichier qui comportait "la totale" avec le fichier sur clé USB, comme cela il fallait activer les macros, et pour que le fichier s'ouvre il fallait le fichier LRD.dat sur une clé USB branchée à l'ordinateur. Le code VBA était protégé par mot de passe.
Le code n'était pas Obfusqué, et ma foi ce sont des protections basics pour le "commun des utilisateurs"...
Ceci pour protéger le fichier source "non partagé" mais accessible, et dans ce dernier un code de copie afin de mettre à disposition les données pour les autres utilisateurs. Version du fichier qui est systématiquement remplacé lors de la fermeture de l'original.
Mais bien évidemment cela ne protège en aucun cas les action d'un utilisateur mal attentionné, cela évite des maladresses d'utilisateur peu concentré, ou vraiment réfractaire à l'outil informatique (si si il y en a encore...) ou des "chats noirs", vous savez les bugs qui sont dus à l'interface chaise / clavier !
@ bientôt
LouReeD
re @LooReed
Reste à voir si le demandeur n'a pas posté ailleurs... puisqu'il ne revient pas.
Pour ma part, je vous laisse continuer sur le fil
A+
Ceci m'importe peu, quoi qu'en dise la charte...
J'aime donné mon avis, des solutions ou propositions, après les "demandeurs" en font ce qu'ils veulent.
Il est vrai qu'un retour est toujours appréciable, mais s'il trouve la solution ailleurs, cela m'aura tout de même permis de faire travailler ma pauvre tête !
Alors c'est vrai je pourrais me mettre "à fond" dans PowerQuerry, mais j'attends avec impatience les cours créés sur cet outils par les grands des répondeurs du site.
@ bientôt
LouReeD (NB : avec "OU"
Bah, chacun fait comme il le veut mais pour ma part je ne vois pas trop l'intérêt de passer du temps à chercher à proposer quelque chose qui ne servira pas.
Autant s'occuper d'autre chose ou alors chercher tout seul pour apprendre si l'on veut.
Après poster fait toujours incrémenter le compteur..
@ bientôt
Après le sujet n'est là que depuis aujourd'hui et l'activité de chacun ne permet pas forcément d'être "au rendez-vous" des réponses...
Et qu'en est-il des messages de remerciement pour une réponse qui ne reçoivent pas de retour du "répondeur" ? Bref tout ceci est une autre histoire, mais je trouve qu'on apprécie qu'une réponse soit accompagnée d'une remerciement, mais rare sont les demandes qu'un remerciement soit suivi d'un message de réception.
J'ai souvent voir presque toujours remercié un demandeur qui me faisait un retour sur une solution/proposition, mais je vois bien que ce n'est pas forcément le cas de tout le monde...
@ bientôt
LouReeD
Bonjour LouReeD !
J'ai besoin de quelques explications sur votre code OPEN s'il vous plaît.
1 : Pourquoi stopper les messages d'alerte ?
2 : C'est peut-être ma façon de pensée qui n'est pas cohérentes mais je voudrais apprendre : pourquoi utiliser la Fonction "ThisWorkbook.Name =" ?
est ce important à ce point ?
3 : Vous écrivez : "si le fichier est ouvert par une personne étrangère à nous" je crois que sur ce point je dois vous apporter peut-être des précisions qui permettrais d'affiner le code :
Puis-je mettre une liste de nom et vérifier si la session windows ouverte correspond à un de ces noms et donc d'autoriser la suite de la macro sinon de refermer immédiatement le fichier ? C'est ce genre de code que je cherche !
Je vais m'arrêter là Mr Le professeur !
Bonjour,
D'abord mille excuses mais j'ai fait une fausse manipulation et j'ai effacé votre message d'hier ...
Dan : Vous avez raison c'est bien de l'accès à un fichier par un utilisateur, pour essayer de faire clair : j'ai un fichier excel qui est diffusé à pleins de personnes mais je souhaite qu'il ne soit ouvert que par les personnes répertoriées dans ce fichier et ceci en vérifiant la session windows ouverte
C'est un peu complexe comme approche d'aller vérifier par rapport à la session de windows et cela n'empêche pas un voisin de bureau d'aller voir ce que contient le fichier.
Sinon vous n'avez pas la possibilité de mettre ce fichier sur un serveur dans un répertoire spécifique plutôt que de l'envoyer à toute une série de personnes ?
Là vous gardez la main sur le fichier, vous pouvez le modifier en temps réel et informer les personnes que le fichier a été modifié
Après pour les personnes répertoriées il y a plein de façon de faire.
Exemple: vous pourriez tout simplement utiliser le nom d'utilisateur excel comme expliqué ici --> https://forum.excel-pratique.com/s/goto/1229720
Crdlt
Bonjour Dan,
Pas de soucis tout le monde à le droit à l'erreur !
Je suis désolé mais j'insiste vraiment sur le fait de vérifier la session ! c'est vraiment ce qui m'intéresse.
Justement je souhaite que un voisin puisse voir et si il le récupère il ne puisse pas l'ouvrir tant que je n'ai pas inscrit son nom dans l'accès au fichier.
Surtout pas de serveur. Je veux absolument diffuser le fichier.
J'ai bien compris votre exemple mais je souhaite vraiment que le fichier soit autorisé à l'ouverture par la vérification de la session ouverte.
Merci encore pour votre intervention !
Bonjour,
ci joint un fichier exploitable :
Les deux codes sur l'ouverture du classeur et sa fermeture :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
' on affiche la feuille demandant d'activer les macros
Sheets("Active Macro").Visible = -1 ' -1 = visible
' on masque les autres
On Error Resume Next
For Each sh In ThisWorkbook.Worksheets
If sh.Name <> "Active Macro" Then sh.Visible = 2 ' 2 = very hidden c'est à dire que sous le classeur on ne peut les afficher
Next
' on arrête d'afficher les alertes afin d'enregistrer le fichier dans sa nouvelle configuration
' comme cela on est "sur" du résultat
Application.DisplayAlerts = False
' on enregistre
ThisWorkbook.Save
End Sub
Private Sub Workbook_Open()
' on attribu à Cqui le résultat de la recher du UserName de session dans le tableau Users
Set Cqui = Range("Users").Find(Environ("UserName"))
' si le résultat est nul c'est que l'utilisateur actuel de la session n'a pas à ouvrir le fichier, on quitte
' If Cqui Is Nothing Then Application.Quit 'ici la ligne est en commentaire afin que vous puissiez arriver sous le fichier
' sinon on affiche totes les feuilles
On Error Resume Next
For Each sh In ThisWorkbook.Worksheets
sh.Visible = -1
Next
' on masque la feuille demandant d'activer les macros
Sheets("Active Macro").Visible = 2 ' 2 = very hidden c'est à dire que sous le classeur on ne peut les afficher
End SubIl est "déverrouillé" pour l'accès en fonction des Users de session Windows afin que vous puissiez y accéder.
Sinon il y a une ligne dont il faut supprimer l'apostrophe afin qu'elle soit fonctionnelle.
Une feuille avec un tableau "Users" qui vous permet de mettre la liste des "autorisé".
A l'ouverture du fichier si les macros ne sont pas active, seule une feuille est visible, cette feuille à pour "papier peint" une image qui demande d'activer les macros.
Une fois le macros activées, le code d'ouverture de classeur fait une recherche du nom de session actuellement en cours sur la liste du tableau Users.
Si le résultat de la recherche ne donne rien, alors on quitte l'application, qui en quittant lance le beforclose et donc cache toutes les feuilles sauf celle demandant d'activer les macros.
Si la recherche aboutie, c'est que la personne est autorisée, alors le code affiche toutes les feuilles et cache la feuille qui demande d'activer les macros.
@ bientôt
LouReeD