Vérifier qu'un fichier n'est pas ouvert

Egruat

XLDnaute Occasionnel
Bonjour !

Je cherche à faire en VBA une petite chose simple mais sur laquelle je bloque...

Travaillant avec de nombreux fichiers Excel ouvert en même temps, je voudrais vérifier qu'un fichier n'est pas ouvert avant de demander à ma macro de l'ouvrir...
J'ai tenté ça mais la macro ne scanne pas tous les fichiers ouverts, elle ne considère que le fichier activé...

Si quelqu'un peut m'aider ??:cool:

Cordialement.

On Error Resume Next
Workbooks("mon fichier").Activate
If Err <> 0 Then
MsgBox ("Le classeur Mon Classeur.xls n'est pas ouvert")
Else: MsgBox ("Le classeur Mon CLasseur.xls est ouvert")
End If
 

RENAUDER

Nous a quitté
Repose en paix
Re : Vérifier qu'un fichier n'est pas ouvert

Bonjour,

Tu peux essayer ce code.
Si il est ouvert, il te le dit sinon il l'ouvre
Code:
Public Etat As Boolean
Sub OuvrirFichier()
    Dim FileToOpen As String
    FileToOpen = "C:\Excel\Caller.xls"
    Etat = IsFileOpen(FileToOpen)
    If Etat = False Then
    Workbooks.Open FileToOpen
    Else
    MsgBox "Le classeur est déjà ouvert."
    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
    End Select
End Function
 

JNP

XLDnaute Barbatruc
Re : Vérifier qu'un fichier n'est pas ouvert

Bonjour le fil :),
Tu peux aussi boucler sur tous les classeurs ouverts :
Code:
Sub Test()
Dim Classeur As Workbook
For Each Classeur In Application.Workbooks
If Classeur.Name = "Mon Classeur.xls" Then
MsgBox "Mon Classeur.xls est ouvert"
Exit Sub
End If
Next Classeur
MsgBox "Mon Classeur.xls est fermé"
End Sub
Bonne soirée :cool:
 

Egruat

XLDnaute Occasionnel
Re : Vérifier qu'un fichier n'est pas ouvert

JNP,

La macro ferme systématiquement le fichier "Mon Fichier" s'il est déjà ouvert...
Application.ScreenUpdating = False
Dim Classeur As Workbook
For Each Classeur In Application.Workbooks
If Classeur.Name <> "Mon Fichier" Then
ChDir "G:\EGRUAT\MARKETS\Statistics"
Workbooks.Open Filename:="C:\Mon Fichier"
ActiveWorkbook.Close
Application.DisplayAlerts = True

Else

End If
Next Classeur
 

Egruat

XLDnaute Occasionnel
Re : Vérifier qu'un fichier n'est pas ouvert

Merci RENAUDER
Je comprends bien la première partie de ton code mais en revanche je ne saisis pas bien la deuxième
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
End Select
End Function

Pourrais-tu me l'expliquer ?

Par avance, merci !
 

RENAUDER

Nous a quitté
Repose en paix
Re : Vérifier qu'un fichier n'est pas ouvert

Bonjour,

Quand tu lances la macro, il y a la ligne

Code:
 Etat = IsFileOpen(FileToOpen)
qui va lire la fonction IsFileOpen et récupère l'état True ou False puis revient dans la procédure et là en fonction du résultat True ou False, la condition If ... then Else ... fait son travail.
Pour comprendre le mieux est de faire du pas à pas (F8)
 

Egruat

XLDnaute Occasionnel
Re : Vérifier qu'un fichier n'est pas ouvert

Merci RENAUDER
En fait je comprends bien cette partie. En revanche, je ne saisi pas les phrases
filenum = FreeFile()
Open Filename For Input Lock Read As #filenum

et je ne comprends pas pourquoi tu fais aller le curseur sur les case 0 ou 70...
 

Egruat

XLDnaute Occasionnel
Re : Vérifier qu'un fichier n'est pas ouvert

Bonsoir Jean-Marcel,
En fait si le fichier est déjà ouvert, mon action est "Ne rien faire". Si le fichier n'est pas déjà ouvert, mon action est "ouvrir le fichier et le fermer". Je ne comprends donc pas pourquoi quand le fichier est déjà ouvert, la macro me le ferme systématiquement...
 

JNP

XLDnaute Barbatruc
Re : Vérifier qu'un fichier n'est pas ouvert

Re :),
JNP,

La macro ferme systématiquement le fichier "Mon Fichier" s'il est déjà ouvert...
Application.ScreenUpdating = False
Dim Classeur As Workbook
For Each Classeur In Application.Workbooks
If Classeur.Name <> "Mon Fichier" Then
ChDir "G:\EGRUAT\MARKETS\Statistics"
Workbooks.Open Filename:="C:\Mon Fichier"
ActiveWorkbook.Close
Application.DisplayAlerts = True

Else

End If
Next Classeur
Il vaut mieux travailler avec une égalité sur le nom de fichier qu'avec une inégalité (ce qui était le cas dans mon code), car sinon, un malheureux classeur ouvert en plus te plantera :rolleyes:...
D'autre part, ActiveWorkbook.Close est assez dangereux, il faut être sûr du fichier actif, or dans ta macro, c'est logiquement celui que tu viens d'ouvrir :p...
Bon courage :cool:
 

RENAUDER

Nous a quitté
Repose en paix
Re : Vérifier qu'un fichier n'est pas ouvert

Bonjour,

Je pense qu'il faut que tu t'investisses personnellement pour comprendre le code que l'on t'envoie allant lire l'aide (F1) sur tout les termes barbares que tu ne connais pas car en général tout est expliqué

Pour comprendre 0 et 70, lancer la procédure ci-dessous...

Code:
Sub TestErreur()
    MsgBox Err = 0
    MsgBox Err = 70
End Sub
FreeFile (Fichier d'aide)
Renvoie une valeur de type Integer représentant le prochain numéro de fichier pouvant être utilisé par l'instruction Open.
SI tu as 3 fichiers d'ouverts, tu ne te poses pas de question, FreeFile t'attribue un numéro de fichier, ce qui évite des conflits de numéro, Excel te les attribuant de manière automatique.

Remarques
Utilisez la fonction FreeFile pour fournir un numéro de fichier encore non utilisé.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Vérifier qu'un fichier n'est pas ouvert

Bonsoir à tous

Un petit ajout pour être fidèle à ma réputation.

VB:
Function IsFileOpen(Filename As String)
'Excel:Check If a File Is Already Open
'Ease of Use :Easy
'Version tested with 2000
'Submitted by: xld
'Description:
'Simple function that checks whether a file is already open within the host application,
'returning True or 'False accordingly.
'Discussion:
'Good programming practice suggests that it is wise to check before taking certain actions.
'One such 'check is before opening a file,
'check whether it is already open or not.
'The code below provides a 'simple function that does this, returning True or False.
'There is also a very simple test program to 'demonstrate the function in use.
'It is possible to run the function from a worksheet formula
'(=IsFileOpen("C:\MyTest\volker2.xls")) although I struggle to see any valid use of this.
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

PS: Pour les commentaires, passer par le MP.
 
Dernière édition:

Efgé

XLDnaute Barbatruc
Re : Vérifier qu'un fichier n'est pas ouvert

Bonjour à tous
Depuis le temps que je cherchais un code efficace sur le test d'ouverture d'un classeur, je remercie RENAUDER de sa contribution :).
Je pense que l'on peux se passer du Select Case:
VB:
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
IsFileOpen = Errnum = 70
End Function
Cordialement
 

Egruat

XLDnaute Occasionnel
Re : Vérifier qu'un fichier n'est pas ouvert

Okay Merci RENAUDER. J'ai bien regardé l'aide avant de te consulter de nouveau. EN fait si j'ai bien tout compris

1) D'abord on paramètre l'action de la fonction IsFileOpen
Public Etat As Boolean
Sub OuvrirFichier()
Dim FileToOpen As String
FileToOpen = "C:\Excel\Caller.xls"
Etat = IsFileOpen(FileToOpen)
If Etat = False Then
Workbooks.Open FileToOpen
Else
MsgBox "Le classeur est déjà ouvert."
End If
End Sub

2) On définit ensuite cette fonction: on attribue un numéro à chaque fichier ouvert et on boucle une lecture de ces fichiers. Les erreurs 0 et 70 sont en fait de type Boolean (vrai ou Faux)
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
End Select
End Function

J'avoue que c'est la 1ère fois que je vois ce type de macro. Pour bien la comprendre, si tu as un peu de temps, est-ce que mon explication est exacte ?

"Open Filename For Input Lock Read As #filenum"
Cette phrase signifie: Ouvre le fichier et attribue-lui la notion de "déjà lu" dans l'élément filenum ?
Est-ce exact ?
"Open ... For" est une propriété ?

Merci encore à tous.
 

RENAUDER

Nous a quitté
Repose en paix
Re : Vérifier qu'un fichier n'est pas ouvert

Bonjour,

1) D'abord on paramètre l'action de la fonction IsFileOpen
On ne paramètre pas, on appelle la fonction IsFileOpen
2) On définit ensuite cette fonction: on attribue un numéro à chaque fichier ouvert et on boucle une lecture de ces fichiers
Lors de l'appel, le programme donne un numéro de fichier libre pour #filenum

Open, instruction
Open pathname For mode [Access access] [lock] As [#]filenumber
mode
: Mot clé indiquant le mode d'ouverture du fichier : Append, Binary, Input, Output ou Random.
S'il n'est pas indiqué, le fichier est ouvert en mode Random.
access Facultatif.
Mot clé indiquant les opérations autorisées sur le fichier ouvert : Read, Write ou Read Write.
lock Facultatif.
Mot clé indiquant les opérations restreintes sur le fichier ouvert par d'autres processus : Shared, Lock Read, Lock Write et Lock Read Write.
filenumber Numéro de fichier valide compris entre 1 et 511, inclus.
Utilisez la fonction FreeFile pour obtenir le prochain numéro de fichier disponible.
 

Discussions similaires

Réponses
2
Affichages
356

Membres actuellement en ligne

Statistiques des forums

Discussions
312 677
Messages
2 090 815
Membres
104 673
dernier inscrit
lautard