Test à l'ouverture d'un fichier Excel se trouvant sur un rés

Bonsoir au forum !

Je vous explique mon problème :

La situation :

il y a un fichier excel avec macro qui se trouve sur un disque réseau.

Pendant deux semaines (environs) si on ouvrait le fichier par un double clic dessus (ou l'utilisation d'un raccourcie), s'il était déjà en utilisation, alors un message d'information indiquait :

"fichier déjà ouvert par LouReeD"

avec un triple choix : "ouverture en lecture seule" "notifier" " annuler"

LouReeD étant le nom d'ouverture de la session Windows.

Le problème :

Depuis peu l'information "LouReeD" est remplacée par "Un autre utilisateur"

La demande :

Est-il possible par VBA à l'ouverture du fichier de "contourner" ce message incomplet afin d'en créer un nouveau en MSGBOX par exemple en allant "chercher" les données manquantes par des instruction VBA ?

Actuellement, afin de faire un filtre automatisé sur le nom d'ouverture de session, j'utilise Application.UserName (de mémoire, je n'ai pas le fichier sous les yeux). Ceci fonctionne très bien.

Mais Est-ce avec ceci que je peux récupérer le nom d'ouverture de session Windows de celui qui a déjà ouvert le fichier ?

Sur le net j'ai trouvé des codes qui permet de tester si le fichier est déjà ouvert, c'est un début, mais la fin, récupérer le nom de celui qui la ouvert, je ne l'ai pas...

Alors merci par avance @ toux ceux qui pourront m'aider, moi et mes collègues de travail.

Ah oui dernière info : comme le fichier contient des macros et qu'il contient également des plages "tableaux", le partage n'est pas possible (si ce n'est de passer par l'excellente application de Sébastien, mais celle-ci n'est pas transposable sur notre réseau "fermé").

@ (très) bientôt

LouReeD

Bonjour,

Je crains que si tu n'as pas l'info c'est qu'elle soit perdue.

Tu pourrais te créer un fichier texte avec le dernier UserName en lecture/écriture avec date/heure ouverture et fermeture et ne pas être tributaire de ceux qui gèrent les serveurs.

Et s'il est ouvert en lecture seule ne pas historiser mais afficher le nom.

eric

Bonjour, et merci eriiic,

en fait après demande auprès des administrateurs réseau, il se trouve qu'il y a eu "certainement" des micros coupures lors de l'utilisation du fichier. Du coup les fichiers "temporaires" avec le symbole ~$ qui montre sur le réseau que le fichier est ouvert quelque part, et bien il en restait 4 plus ou moins fantômes, dont un visible datant du 23/03/2016 qu'on pouvait supprimer mais dès que l'on faisait [F5] il réapparaissait !!!!

Donc les administrateurs avec leur super pouvoir ont effacé ces fichiers résiduels et hourra ! Lorsque l'on ouvre le dit fichier et qu'il est déjà ouvert on retrouve le message d'information avec le nom de l'utilisateur "en écriture" d'indiqué !

Ceci dit eriiic, j'étais parti sur votre idée de fichier texte avec le nom de "l'ouvreur". Je ne l'ai géré que pour le premier en écriture.

Si un personnel venait à ouvrir le fichier alors la macro détecter l'info sur le fichier texte et le signaler par MSGBOX. Nickel !

Mais le soucis c'est le nombre de fois qu'il est ouvert ! Je m'explique :

si A ouvre le fichier en premier il l'a en écriture, ok. B arrive et ouvre le fichier, la macro détecte le fichier texte avec le nom de A donc indique à B par MSGBOX que A a ouvert le fichier. OK, mais si A ferme le fichier alors que B le laisse ouvert, et que C arrive pour l'ouvrir alors la macro ne gère plus rien ... car le fichier texte est redevenu vierge du fait que A a fermé le fichier et du coup quand C l'ouvre, la macro croit qu'il est en écriture car texte vierge mais en fait il est en lecture car B l'a encore ouvert.... Bref il faudrait faire un fichier texte avec toutes les connections et en plus les supprimer en fonction des fermetures... mais l'information "application.username n'est pas accessible lorsque le fichier est en lecture seule....

Bref il y avait un problème, les administrateurs l'ont réglé, et ça marche bien comme cela...

@ bientôt

LouReeD

eriiic a écrit :

Bonjour,

Je crains que si tu n'as pas l'info c'est qu'elle soit perdue.

Tu pourrais te créer un fichier texte avec le dernier UserName en lecture/écriture avec date/heure ouverture et fermeture et ne pas être tributaire de ceux qui gèrent les serveurs.

Et s'il est ouvert en lecture seule ne pas historiser mais afficher le nom.

eric

Excellent ! j'avais déjà rencontré une telle fonctionnalité.

Quelqu'un a-t-il un petit code qu'il a déjà réalisé ? ou je me creuse les méninges ...

Bonsoir,

j'en ai un mais au boulot...

Le principe :

dans un module :

une variable boolean Public Lecture_seule définie à False (c'est le cas par défaut)

dans open de thisworkbook :

ouverture du fichier Ouvert_par.txt

analyse du contenu :

si vierge alors le fichier excel n'est pas ouvert par un autre utilisateur, il est en lecture/écriture donc on inscrit le nom de l'utilisateur actuel dans le fichier et on passe la variable public Lecture_Seule à False (elle y est déjà, mais bon c'est rassurant)

si non vierge alors le fichier excel est déjà en lecture/écriture quelque part donc MSGBOX avec la valeur du fichier texte qui correspond au nom serveur de l'utilisateur. La variable Lecture_Seule est passée à True.

Dans close de thisworkbook :

on teste la variable Lecture_Seul :

si elle est à True alors on laisse le classeur se fermer sans toucher au fichier texte.

si elle est à False alors on supprime la valeur existante sur le fichier texte car c'est nous qui sommes en lecture/écriture et comme on quitte l'application on "la rend" de nouveau accessible pour les suivants.

Voilà, comme j'ai dis sur le post d'avant il y a un problème : si A ouvre le fichier le premier, pas de problème il est en lecture / écriture et le fichier texte est renseigner par "A". B ouvre le fichier, pas de problème, un MSGBOX indique "est utilisé par A". B utilise le fichier en lecture seul. A ferme le fichier, le close de thisworkbook "vide" le fichier texte car c'est bien A qui était en lecture / écriture et qu'il ferme le fichier, on se retrouve donc dans une situation "bancale" : fichier texte vierge hors le fichier est ouvert par B ! donc si C ouvre le fichier, le open du classeur vérifie le fichier texte voit qu'il est vide donc considère C comme étant l'utilisateur en lecture / écriture inscrit son nom sur le fichier "C" mais "hélas" il n'a pas les droits pour l'écriture car déjà ouvert par B et pourtant il n'y a pas eu des MSGBOX l'indiquant...

Au travail, le deuxième problème c'est que l'information du nom réseau de l'utilisateur d'Excel n'est accessible uniquement quand le fichier est en lecture / écriture ! Donc quand B ouvre le fichier la fonction Application.UserName(1,1) renvoie une erreur ! Et du coup on ne connaît pas le nom de B. Ceci dit c'est peut-être un mauvais emplois de fonction car il existe Environ(Username) ou un truc comme ça....

Demain je tâcherais de ramener les bouts de code...

@ bientôt

LouReeD

En fait je pensais plus à utiliser la propriété ReadOnly qui permet de voir comment le fichier a été ouvert, indépendamment du fichier histo.

Qq chose comme :

Private Sub Workbook_Open()
    Dim numfich As Integer, s As String
    numfich = FreeFile
    If ThisWorkbook.ReadOnly Then
        ' afficher nom histo
        Open ThisWorkbook.Path & "\histo.txt" For Input Lock Read Write As #numfich
        Line Input #numfich, s
        MsgBox s
    Else
        ' enregistrer nom histo
        Open ThisWorkbook.Path & "\histo.txt" For Output As #numfich
        Print #numfich, "Ouvert par " & Application.UserName & ", le " & Now
    End If
    Close #numfich
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim numfich As Integer
    numfich = FreeFile
    If Not ThisWorkbook.ReadOnly Then
        ' supprimer nom histo
        Open ThisWorkbook.Path & "\histo.txt" For Output As #numfich
        Print #numfich,
    End If
End Sub

Sub test()
    Workbook_BeforeClose (True)
End Sub

J'imagine le fonctionnement comme ça :

  • A ouvre le 1er, readonly=false donc historisation
  • B ouvre, readonly=true donc affichage histo
  • A ferme, suppression histo
  • C ouvre , readonly=false donc historisation et droits en écriture
Seul celui qui l'a ouvert en écriture peut supprimer l'histo à la fermeture.

A voir en réel si ça se confirme bien sûr.

J'avoue que j'ai du mal à comprendre dans ta description pourquoi C n'aurait pas les droits à l'écritures puisqu'il ouvre après la fermeture de A, et pourquoi B les aurait récupérés alors qu'il est en lecture seule. Et de toute façon B pour moi n'a pas à enregistrer sous le même nom (de toute façon excel devrait l'obliger à renommer) sous peine d'écraser les modifs de A (?)

Et même si B récupère les droits suite à une notification demandée ça correspond à une ouverture avec droits en écriture donc historisation.

Vu que je ne peux pas simuler la réalité je ne vois pas où est la faille...

eric

Bonjour eriiic,

faille peut-être n'y est pas, je vais tester ce jour et je répondrais.

Dans mon explication si B en lecture seul et que A ferme, alors quand C ouvre, le fichier étant déjà ouvert par B, C a t il vraiment l'autorisation d'écriture ?

J'essaie et je rend compte

@ bientôt

LouReeD

Bonjour,

Normalement si B n'a pas rouvert le fichier il reste en readonly et C ouvre en écriture.

Mais si le fichier a été mal fermé ça ne changera rien, tout le monde sera en readonly tant que le ménage n'aura pas été fait.

Ca ne peut pallier qu'à un défaut d'identification.

eric

Bonsoir,

en effet eriiic vous avez (toujours ) raison :

si A ferme son fichier en écriture/lecture alors que B reste ouvert en lecture seul, alors si C ouvre le fichier il récupère toutes les options du fichier en lecture / écriture.

Je crois que je vais me permettre de prendre votre code de fichier txt car il me semble qu'il est plus simple que le mien. Merci encore à vous.

Il faut savoir que c'est un code qui "pali" un bug de réseau...

@ bientôt

LouReeD

Bonjour Eric,

Y a t-il moyen d'en faire un log de tous les accès ?

Bonjour,

Oui.

Exemple histo des 10 dernières ouvertures en écriture, avec indication si des modifs ont été enregistrées et heure de fermeture.

A tester

eric

Quand un "bleu cyan" pose une question, il faut déjà s'attendre à ce que cette question soit des plus pertinentes ! Et quand un rouge répond, cela devient le graal.

J'aime beaucoup ce post... merci Eric et LouReeD

Le rouge veut dire que j'ai suffisamment répondu.

Il peut y avoir 80% d’âneries

eric

Bonjour,

Est-ce que quelqu'un peut me partager le/les code qu'il y a dans le fichier

historisation-username-ouverture.xlsm (20.52 Ko)

Fortinet m'empêche de télécharger l'excel..

Merci!

Bonjour,

Merci d'avoir fait remonter ce post, il est super intéressant !!

Option Explicit

Dim b_modif As Boolean
Const nbHisto As Long = 10

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If Not ThisWorkbook.Saved Then
        ' des modifs sont enregistrées
        b_modif = True
    End If
End Sub

Private Sub Workbook_Open()
' historisation des 10 dernières ouvertures avec modifications enregistrées
    Dim numfich As Integer, s(0 To nbHisto) As String, i As Long
    Dim nomFich

    nomFich = ThisWorkbook.Path & "\" & ThisWorkbook.Name & "_histo.txt"
    If Dir(nomFich) = "" Then
        ' création du fichier histo.txt
        numfich = FreeFile
        Open nomFich For Output As #numfich
        Close #numfich
    End If

    numfich = FreeFile
    If ThisWorkbook.ReadOnly Then
        ' ouverture xls en lecture seule
        ' afficher dernier nom écriture
        Open nomFich For Input Lock Read Write As #numfich
        Line Input #numfich, s(0)
        Close #numfich
        MsgBox "Dernière ouverture par " & IIf(s(0) = "", "Inconnu", s(0))
    Else
        ' ouverture xls en écriture
        Open nomFich For Input Lock Read Write As #numfich
        While Not EOF(numfich)
            i = i + 1
            Line Input #numfich, s(i)
        Wend
        Close #numfich
        numfich = FreeFile
        Open nomFich For Output Lock Read Write As #numfich
        s(0) = Application.UserName & ", le " & Now
        For i = 0 To Application.Min(nbHisto - 1, i)
            Print #numfich, s(i)
        Next i
        Close #numfich
    End If
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim numfich As Integer, s(0 To nbHisto) As String, i As Long
    Dim nomFich

    nomFich = ThisWorkbook.Path & "\" & ThisWorkbook.Name & "_histo.txt"
    numfich = FreeFile
    Open nomFich For Input Lock Read Write As #numfich
    While Not EOF(numfich)
        i = i + 1
        Line Input #numfich, s(i)
    Wend
    Close #numfich
    s(1) = s(1) & ", Modif:" & IIf(b_modif, "Oui", "Non") & ", fermé à " & Time
    numfich = FreeFile
    Open nomFich For Output Lock Read Write As #numfich
    s(0) = Application.UserName & ", le " & Now
    For i = 1 To Application.Min(nbHisto - 1, i)
        Print #numfich, s(i)
    Next i
    Close #numfich
    b_modif = False ' simulation fermeture pour tests
End Sub

Sub test()
    Workbook_BeforeClose True
End Sub

Bonjour à tous,

Je vais me laisser aller à un truisme, mais ça va mieux en le disant : à mettre dans ThisWorkbook
eric

Bonjour à tous,

Merci!

Rechercher des sujets similaires à "test ouverture fichier trouvant res"