XL 2019 Trouver par qui un fichier est utilisé

ThierryP

XLDnaute Occasionnel
Bonjour le forum,

J'ai une macro qui crée un fichier à partir d'un xml exporté par un ERP et qui va chercher des infos dans un autre fichier.
Si ce dernier fichier est ouvert, ça plante.... Normal ! Je sais tester si le fichier est ouvert ou non, par contre j'ai besoin de savoir QUI a ouvert ce fichier.... et là, ça coince !

Après pas mal de recherches, je suis tombé sur une procédure proposée par Michel Perron et proposée par michdenis sur le MPFE (juste en écrivant ça, je me sens vieux tout à coup 😕😕😕) :
VB:
Sub WhoHasFileOpen()
Dim fso As Object, Res As Object, i&: i = 1
Dim Fichier As String

Fichier = "I:\Production\Logistique\Planning\Rapports SAP\" & "2023-07 Encours PF_5.xlsm"
If Fichier = "" Then Exit Sub
On Error Resume Next
Set fso = GetObject("WinNT://mondomaine/monserveur/LanmanServer")
If IsEmpty(fso) Then Exit Sub
For Each Res In fso.Resources
    If Not Res.User = "" And Not Right(Res.User, 1) = "$" Then
        If InStr(1, Res.Path, Fichier, 1) Then
            Range("A" & i) = Res.Path
            Range("B" & i) = Res.User
            'MsgBox "Fichier ouvert par " & Res.User
            i = i + 1
        End If
    End If
Next Res
End Sub
Malheureusement, je ne parviens pas à adapter le code....

Si un gourou charitable passe par là et pouvait me donner une piste, il aurait droit à toute ma reconnaissance !
Merci d'avance,
 

ThierryP

XLDnaute Occasionnel
Bonjour kiki29 et Phil69970,

@kiki29 : je suis en train de creuser mes recherches grâce à ton lien, j'ai peut-être une piste... Si ça fonctionne, je publierais la macro, ça doit pouvoir servir à d'autres !!

@Phil69970 : j'avais déjà vu ce code, mais il ne me convient pas, je ne souhaite pas passer par un fichier supplémentaire... Mais si je ne trouve rien d'autre, je pourrais adapter ce code !

Merci de vous pencher sur mon petit souci :)
 

oguruma

XLDnaute Occasionnel
hello, je passe juste la tête....petite remarque.... une recherche sur les annuaires soit openLDAP ou AD (Active Directory) car désormais tous les comptes sont identifiés par ces annuaires. Donc pas certains que les noms de domaines aux sens WinNT et un vieux de la vieille comme LanManager.... (Ohhh là je viens de faire un flash back de -25 ans au moins)....fonctionnent toujours on va presque arriver à OS/2 ;)
ET pour m'y être un frotter sans succès : dans certains cas il faut traverser les firewall ou avoir les autorisations pour requêter sur ces annuaires LDAP ou AD afin de récupérer les flux que détient un utilisateur.
Autre point si ton fichier Excel est en réseau les accès pour détecter le UserName actif ralentissent l'ouverture.
J'ai aussi donné dans ce domaine. Cas rencontré avec un fichier hébergé sur sharepoint (beurkkk ;))
 

ThierryP

XLDnaute Occasionnel
Bonjour oguruma,
effectivement, pour certains fichiers je recherche dans mon AD pour déterminer si le user est autorisé ou non, ça fonctionne bien... et oui le LanMan ne nous rajeunit pas :)

Finalement, la macro fonctionne mais c'est beaucoup trop lourd...
 

ThierryP

XLDnaute Occasionnel
Finalement, j'ai pu adapter un code trouvé sur site anglophone, l'idée est très bonne mais malheureusement pas fiable à 100%
J'ai testé depuis plusieurs postes, donc plusieurs users différents et j'ai eu un cas au moins où la macro plante parce que la variable x est vide....(voir ce lien :
D'après mes quelques tests, il semble que ce soit lié à l'utilisateur et non au poste (testé même utilisateur sur plusieurs postes), mais pourquoi, comment, là je sèche....
Mon code adapté :
VB:
Function InUse(Fichier As String)
Dim i As Integer
Dim TempFile As String, Utilisateur As String, FSO

TempFile = Environ("TEMP") + "\tempfile" & CStr(Int(Rnd * 1000))
i = InStrRev(Fichier, "\")
Fichier = Mid(Fichier, 1, i) & "~$" & Mid(Fichier, 1 + i)
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFile Fichier, TempFile
Open TempFile For Binary Access Read As #1
Input #1, Utilisateur
Close (1)
FSO.DeleteFile TempFile
Set FSO = Nothing
Utilisateur = Mid(Utilisateur, 2, Asc(Utilisateur))
MsgBox "Fichier ouvert par : " & Utilisateur, vbOKOnly
End Function

Plus qu'à mettre une petite gestion d'erreurs et tout ira bien !!
Merci à tous ceux qui sont passés sur ce post !
 
Dernière édition:

oguruma

XLDnaute Occasionnel
Finalement, j'ai pu adapter un code trouvé sur site anglophone, l'idée est très bonne mais malheureusement pas fiable à 100%
J'ai testé depuis plusieurs postes, donc plusieurs users différents et j'ai eu un cas au moins où la macro plante parce que la variable x est vide....(voir ce lien :
D'après mes quelques tests, il semble que ce soit lié à l'utilisateur et non au poste (testé même utilisateur sur plusieurs postes), mais pourquoi, comment, là je sèche....
Mon code adapté :
VB:
Function InUse(Fichier As String)
Dim i As Integer
Dim TempFile As String, Utilisateur As String, FSO

TempFile = Environ("TEMP") + "\tempfile" & CStr(Int(Rnd * 1000))
i = InStrRev(Fichier, "\")
Fichier = Mid(Fichier, 1, i) & "~$" & Mid(Fichier, 1 + i)
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFile Fichier, TempFile
Open TempFile For Binary Access Read As #1
Input #1, Utilisateur
Close (1)
FSO.DeleteFile TempFile
Set FSO = Nothing
Utilisateur = Mid(Utilisateur, 2, Asc(Utilisateur))
MsgBox "Fichier ouvert par : " & Utilisateur, vbOKOnly
End Function

Plus qu'à mettre une petite gestion d'erreurs et tout ira bien !!
Merci à tous ceux qui sont passés sur ce post !
Ma solution quand la complexité grandit est de laisser cela à Excel avec l'apparition d'un message comme quoi le fichier est pris par un autre. Après ça se règle en interne. La personne lâche le fichier. Un ptit coup de Teams ou Skype ("coucou tu peux lâcher le fichier xxxxxxxxxxxx.xlsx stp").... est bien plus simple que de s'embarquer dans du code réseau... :) ;)... enfin c'est ma vision des choses
 

Discussions similaires

Réponses
4
Affichages
394
Réponses
2
Affichages
147

Statistiques des forums

Discussions
314 422
Messages
2 109 447
Membres
110 482
dernier inscrit
ilyxxxh