VBA test si fichier ouvert
Bonjour,
Dans mon entreprise, nous avons un fichier nommé COMPTABILITE .xls. Ce fichier est en réseau.
La macro suivante permet de savoir si un autre utilisateur l’a ouvert depuis son poste, mais elle ne fonctionne pas correctement.
En effet, si le fichier est ouvert sur mon poste, la macro fonctionne parfaitement. Mais si un autre utilisateur l’a ouvert sur son poste, la macro indique malgré tout que le fichier n’est pas ouvert.
Pourriez-vous me dire ce qui ne vas pas.
En vous remerciant de votre aide.
Sub Ctrl_Fichier_Ouvert()
Dim Wb As Workbook
For Each Wb In Workbooks
If Wb.Name = "COMPTABILITE.xls" Then '
MsgBox "Le fichier " & Wb.Name & " est déjà ouvert !"
Exit For
End If
Next Wb
If Wb Is Nothing Then
MsgBox "Le fichier n'est pas ouvert"
End If
End Sub
Bonjour,
C'est normal, en fait dans ce code tu vérifie, pour chaque classeur (Wb) présent dans la collection "Workbooks" si il correspond au fichier à tester, sauf que la collection "Workbooks" correspond aux classeurs Excel ouverts dans ton instance d'Excel.
(Donc déjà si tu lances 2 instances d'Excel sur ton pc avec ton fichier Comptabilité dans une, et ton fichier avec ta macro dans l'autre, je ne suis pas certain que cela fonctionne).
Pour ma part, j'utilise le code suivant :
Function IsFileOpen(filename As String) As Boolean
Dim filenum As Integer, Errnum As Integer
On Error Resume Next
filenum = FreeFile()
Open filename For Input Lock Read As #filenum
Close filenum
Errnum = Err
On Error GoTo 0
Select Case Errnum
Case 0
IsFileOpen = False
Case 70
IsFileOpen = True
End Select
End Function
Que je n'ai qu'à simplement appelé en faisant :
IsFileOpen(chemin de mon fichier sur le serveur)
Qui me retourne vrai ou faux, valeur que je peux tester pour soit avertir l'utilisateur si le fichier est ouvert / fermé, soit faire mon traitement.
Cordialement.
Bonjour Zirak,
Hélàs, çà ne marche toujours pas
Bonjour,
Tu as bien fais un copier / coller de la fonction ci-dessus sans la modifier ?
Pourrais-tu poster le bout de code réalisé pour l'appeler ?
"Cela ne marche toujours pas", mais la macro t'indique quoi ? Quel est le message d'erreur (si il y en a un) ?
Cordialement,
Bonjour,
Bon, voilà une autre macro qui fonctionne parfaitement ! Si MonFichier.xls est ouvert par un autre utilisateur, on valide le message OK puis fin.
Par contre je voudrais incorporer cette macro dans une autre macro, mais je ne sais pas comment m'y prendre.
J'expose mon cas. Une macro (appelons M) permet de copier des données du fichier Base.xls vers MonFichier.xls.
Si MonFichier.xls est ouvert par un autre utilisateur, la macro M ne s'exécute pas et indique le messge "Attention, le fichier est ouvert par un autre utilisateur ! Réessayer, plus tard."
Si MonFichier.xls n'est pas ouvert, la macro M s'exécute. Mais comment faire ? Pouvez-vous m'aiguiller ?
Cordialement.
Option Explicit
Sub TestFileOpened()
If IsFileOpen("\\chemin du fichier\ Monfichier.xls") Then
MsgBox "Attention, le fichier est ouvert par un autre utilisateur ! Fin du traitement Réessayer, plus tard."
Else
End If
End Sub
Function IsFileOpen(filename As String)
Dim filenum As Integer, errnum As Integer
On Error Resume Next
filenum = FreeFile()
Open filename For Input Lock Read As #filenum
Close filenum
errnum = Err
On Error GoTo 0
Select Case errnum
Case 0
IsFileOpen = False
Case 70
IsFileOpen = True
Case Else
Error errnum
End Select
End Function
sophang a écrit :Bonjour,
Bon, voilà une autre macro qui fonctionne parfaitement !
C'est exactement le code que je t'ai fourni et qui ne "marchait pas" dans ton message de ce matin...
J'expose mon cas. Une macro (appelons M) permet de copier des données du fichier Base.xls vers MonFichier.xls.
Si MonFichier.xls est ouvert par un autre utilisateur, la macro M ne s'exécute pas et indique le messge "Attention, le fichier est ouvert par un autre utilisateur ! Réessayer, plus tard."
Si MonFichier.xls n'est pas ouvert, la macro M s'exécute. Mais comment faire ? Pouvez-vous m'aiguiller ?
Bein tu appelles ta macro M dans ton "Else" de ton test d'ouverture :
Sub TestFileOpened()
If IsFileOpen("\\chemin du fichier\ Monfichier.xls") Then
MsgBox "Attention, le fichier est ouvert par un autre utilisateur ! Fin du traitement Réessayer, plus tard."
Else
' code de la macro M ou appel vers cette macro
End If
End Sub
Ok, c'est bon maintenant. C'est nickel !