Identifier l'utilisateur qui verrouille le fichier

Bonsoir

Nous utilisons un fichier commun qui ne peut-être passé en "classeur partagé". La dernière fois que nous avons essayé de le transformer en classeur partagé plusieurs macros avaient sauté...

Dans les grandes lignes il s'agit d'un fichier de suivi des commandes avec notamment une macro permettant d'insérer une nouvelle ligne. Cette macro effectue un copié-coller de la dernière ligne ajoutée au fichier puis efface le contenu des cellules collées. J'ai adapté cette macro de sorte qu'elle détecte si le fichier est actuellement verrouillé (ou non) lorsque l'utilisateur déclenche la macro permettant d'ajouter une nouvelle ligne.

J'aimerais, si cela est possible, indiquer à l'utilisateur la personne qui est en train d'éditer le fichier. J'avais testé la variable "Environ" qui me renvoyait bien le log d'un de mes collaborateur. Toutefois, ce log correspondait en permanence à la personne qui avait créé ce fichier...

Environ("USERNAME")

Est-il possible qu'excel renvoi le véritable log de l'utilisateur qui édite le fichier et non le log de l'utilisateur ayant créé ce fichier ?

Je vous joins un fichier test avec la macro qui vérifie que le fichier est en lecture seule lorsque l'utilisateur clique sur le bouton "nouvelle commande".

106readonly-testbk.xlsm (42.73 Ko)

Merci d'avance pour votre aide.

Baptiste

Bonjour,

s'il n'est pas partagé comment êtes-vous à plusieurs dessus ?

Via OneDrive ?

eric

Bonjour Baptiste, slt eriiic,

il y a un bon exemple à télécharger gratuitement ici:

https://excel-malin.com/tutoriels/vba-tutoriels/suivre-activite-d-utilisateur-log/

ps/ une fois le fichier log mit en place, il est facile de lire la ou les dernières entrées sous la forme souhaitée.

Bonjour eriiic

s'il n'est pas partagé comment êtes-vous à plusieurs dessus ?

Via OneDrive ?

En fait nous utilisons le fichier tour à tour dès qu'une nouvelle commande doit-être ajoutée. Ce fichier est sur un serveur partagé sur notre serveur informatique.

Bonjour i20100

J'ai effectivement vu cette solution, toutefois j'aimerais indiquer la personne qui modifie le fichier lorsqu'un utilisateur souhaite créer une nouvelle commande dès lors que le fichier est en lecture seule. Toutefois, est-il possible d'aller chercher le nom de l'utilisateur qui modifie le fichier, où son identifiant se trouvera dans le fichier "log" puis d'afficher ce nom dans une msgbox par exemple ?

Merci pour votre retour

Baptiste

Bonjour,

Tout simplement est ce qu'on ne créerait pas des inputbox où on demande aux utilisateurs de se loger avec identifiants et mot de passe et on génère l'historique des connexions sur un onglet caché ?

Bonjour BAROUTE78

J'y ai pensé mais je ne souhaiterais pas rajouter des userform supplémentaires à l'ouverture du fichier... L'idéal serait que cela se fasse en transparence.

Il n'est pas possible, à défaut, de renvoyer le nom de l'ordinateur où le fichier est ouvert ?

Baptiste

Hello,

Du coup c'est bizarre que environ("USERNAME") te renvoie le nom de la personne qui a créé le document.

Quand j'exécute ce code dans ton fichier (tu en es l'auteur) et dans un de mes fichiers, il me renvoie constamment mon nom utilisateur et non celui de l'auteur du document :

Sub TEST()

Dim sUserName As String

sUserName = Environ("USERNAME")

MsgBox (sUserName)

End Sub

Sinon pour le nom de l'ordinateur, essaie Environ("COMPUTERNAME")

Bonjour,

Sinon, tu as application.username qui te renvoie le nom d'utilisateur office

Re BAROUTE78, Bonjour melch,

J'ai testé Environ("COMPUTERNAME") et Environ("USERNAME") et effectivement ça ma envoyé mon nom d'utilisateur et non celui de l'auteur du fichier. En fait c'est le nom de la dernière personne qui a modifié le fichier qui est envoyé !

Concernant application.username dans le Wiki de Office, il est indiqué que c'est le nom de l'utilisateur en lecture/écriture qui est renvoyé. Toutefois, en ouvrant le fichier sur mon poste et en l'ouvrant (en lecture seule donc) sur un autre poste, c'est le nom d'utilisateur de celui qui est en lecture seule qui apparait dans ma msgbox.

https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.username

Du coup je me pose une question par rapport à la méthode que m'a proposé i20100 avec les logs :

Vu qu'un fichier texte est créé lorsque l'utilisateur se connecte au fichier, le modifie, le ferme... ne serait-il pas possible de récupérer le contenu du fichier en .txt et indiquer son contenu dans une Msgbox ?

En gros :

1) Le Environ("USERNAME") de l'utilisateur qui vient d'ouvrir le fichier est ajouté à un fichier .txt sur notre réseau commun

2) Un utilisateur qui ouvre le fichier alors que celui-ci est en lecture seule voit une msgbox apparaitre ou le nom d'utilisateur qui modifie le fichier est inscrit : ce nom étant extrait du fichier .txt

Merci d'avance pour vos lumières

Baptiste

Bonjour,

ce que j'avais préparé hier soir, mais j'attendais de savoir s'il pouvait y avoir plusieurs utilisateurs possibles en écriture.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Not ThisWorkbook.ReadOnly Then Kill "D:\tmp\verrou.txt" ' supp verrou
End Sub

Private Sub Workbook_Open()
    Dim numfich As Integer, us As String
    If Dir("D:\tmp\verrou.txt") = "" Then
        numfich = FreeFile
        Open "D:\tmp\verrou.txt" For Output As #numfich
        Print #numfich, Application.UserName & " le " & Now() ' pose verrou
        Close #numfich
    Else
        numfich = FreeFile
        Open "D:\tmp\verrou.txt" For Input As #numfich
        Input #numfich, us
        Close #numfich
        MsgBox "Fichier en lecture seule !" & vbLf & "Utilisé par " & us ' info
    End If
End Sub

eric

Bonjour eriiic

Merci pour cette solution, pour le moment je ne peux pas encore tester en ouvrant mon fichier en lecture seule depuis un autre ordinateur mais la façon dont le fichier txt est créé (et supprimé) me va parfaitement.

J'ai modifié la façon dont le nom de l'utilisateur qui verrouille le fichier est indiqué MsgBox "Fichier utilisé par " & us par ce code qui permet d'aller chercher le véritable nom de l'utilisateur en fonction de sa matricule d'entreprise.

MsgBox "Fichier utilisé par " & Application.VLookup(us, Feuil2.Range("J5:K50"), 2, False) 

Néanmoins lorsque le matricule n'est pas trouvé dans la plage de cellules, le code m'indique une erreur. Est-il possible que lorsque le matricule n'est pas trouvé dans la plage de cellule, le msgbox renvoi uniquement le matricule sans effectuer la rechercheV.

Merci d'avance

Baptiste

Je pense que tu as modifié aussi la partie enregistrement du verrou.

Essaie avec :

& Application.IfError(Application.VLookup(us, Feuil2.Range("J5:K50"), 2, False), us)

eric

PS :

pour le moment je ne peux pas encore tester

Si tu peux.

Tu l'ouvres une première fois.

Puis clic-droit sur le fichier, tu gardes Alt appuyé en cliquant sur Ouvrir et jusqu'à ce que tu aies la question : Ouvrir une nouvelle session.

eric

Bonjour eriiic

Je suis pas sur d'avoir bien compris, j'ai uniquement mis la variable & Application.IfError(Application.VLookup(us, Feuil2.Range("J5:K50"), 2, False), us) sur la ligne de la MsgBox. Néanmoins, la rechercheV ne fonctionne pas lorsque j'ouvre le fichier en lecture seule.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Not ThisWorkbook.ReadOnly Then Kill "C:\tmp\LogFEM\verrou.txt" ' supp verrou
End Sub

Private Sub Workbook_Open()

    Dim numfich As Integer
    Dim us As String

    If Dir("C:\tmp\LogFEM\verrou.txt") = "" Then
        numfich = FreeFile
        Open "C:\tmp\LogFEM\verrou.txt" For Output As #numfich
        Print #numfich, Application.UserName & " le " & Now() ' pose verrou
        Close #numfich
    Else
        numfich = FreeFile
        Open "C:\tmp\LogFEM\verrou.txt" For Input As #numfich
        Input #numfich, us
        Close #numfich
        MsgBox "Fichier en lecture seule !" & vbLf & "Utilisé par " & Application.IfError(Application.VLookup(us, Feuil3.Range("B2:C3"), 2, False), us) ' info
    End If
End Sub

Le fichier :

Merci

Bonjour,

Print #numfich, Application.UserName & " le " & Now() ' pose verrou

inscrit utilisateur + date/heure dans le fichier verrou.

Soit tu supprimes & " le " & Now() ici, soit tu le supprimes de la variable us lors de ta recherche.

eric

Bonjour eriiic

ça fonctionne parfaitement ! Encore merci c'est bien plus robuste que la première solution que j'avais trouvé. Encore merci !

Baptiste.

Rechercher des sujets similaires à "identifier utilisateur qui verrouille fichier"