Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tester si un fichier excel est déjà ouvert...

10 réponses
Avatar
Fabrice N.
Bonjour à tous,

Sous Access 2003.

Via VBA, je fais un export via la command DoCmd.TransferSpreadsheet.
Si le fichier est ouvert au moment de cet export, l'appli se bloque et
semble tourner en rond. Si je ferme le fichier, j'obtient une erreur.
Je ne peux pas utiliser la gestion d'erreur puisque j'obtient cette
erreur qu'une fois le fichier fermé...

Je souhaiterais donc savoir s'il existe un moyen de tester si le
fichier n'est pas déjà ouvert avant de lancer l'export pour pouvoir le
signaler à l'utilisateur au lieu de tout bloquer...

Merci d'avance pour vos conseils...

A+

10 réponses

Avatar
Thierry (ze Titi)
Bonjour Fabrice,

tu peux déjà tester si Excel est ouvert (à défaut de mieux pour
l'instant, mais je cherche...)
http://officesystemaccess.seneque.net/apiisofficerunning.htm


Dans ton message du mardi
23/10/2007 jour de Saint Jean de Capistran., tu as pris l'initiative de
nous narrer les faits suivants:
Bonjour à tous,

Sous Access 2003.

Via VBA, je fais un export via la command DoCmd.TransferSpreadsheet.
Si le fichier est ouvert au moment de cet export, l'appli se bloque et semble
tourner en rond. Si je ferme le fichier, j'obtient une erreur.
Je ne peux pas utiliser la gestion d'erreur puisque j'obtient cette erreur
qu'une fois le fichier fermé...

Je souhaiterais donc savoir s'il existe un moyen de tester si le fichier
n'est pas déjà ouvert avant de lancer l'export pour pouvoir le signaler à
l'utilisateur au lieu de tout bloquer...

Merci d'avance pour vos conseils...

A+


--
Cordialement,
Thierry

Tout pour réussir avec Access :
http://www.mpfa.info

Avatar
Thierry (ze Titi)
.../...

Mieux:

Function cherche(nomFichier As String) As Boolean
Dim xl As Excel.Application
Set xl=CreateObject("Excel.Application")
Dim wb As Excel.Workbook
chercheúlse
For Each wb In xl.Workbooks
If wb.Name = nomFichier Then
cherche=True
End If
Next
Set wb=Nothing
Set xl=Nothing
End Function



Dans ton message du mardi
23/10/2007 jour de Saint Jean de Capistran., tu as pris l'initiative de
nous narrer les faits suivants:
Bonjour à tous,

Sous Access 2003.

Via VBA, je fais un export via la command DoCmd.TransferSpreadsheet.
Si le fichier est ouvert au moment de cet export, l'appli se bloque et semble
tourner en rond. Si je ferme le fichier, j'obtient une erreur.
Je ne peux pas utiliser la gestion d'erreur puisque j'obtient cette erreur
qu'une fois le fichier fermé...

Je souhaiterais donc savoir s'il existe un moyen de tester si le fichier
n'est pas déjà ouvert avant de lancer l'export pour pouvoir le signaler à
l'utilisateur au lieu de tout bloquer...

Merci d'avance pour vos conseils...

A+


--
Cordialement,
Thierry

Tout pour réussir avec Access :
http://www.mpfa.info

Avatar
Rv
Salut,

Je pense que l'on peut trouver une solution avec la fonction getObject
de VBA.

A partir du lien ci-dessous on a déjà un test pour l'existence d'une
instance d'Excel:
http://msdn2.microsoft.com/fr-fr/library/e9waz863(VS.80).aspx
Donc si excel n'est pas ouvert il y a de bonnes chances que le fichier soit
disponible. Sinon on a récupéré un objet représentant l'instance d'excel et
on doit pouvoir parcourir tous les classeurs en vérifiant le nom des
fichiers associés.
Il reste peut-être un souci si il y a plusieurs Excel ouverts!

A+

Rv


"Fabrice N." <"fabrice.n.surlenet" avec l'@ chez free> a écrit dans le
message de news:
Bonjour à tous,

Sous Access 2003.

Via VBA, je fais un export via la command DoCmd.TransferSpreadsheet.
Si le fichier est ouvert au moment de cet export, l'appli se bloque et
semble tourner en rond. Si je ferme le fichier, j'obtient une erreur.
Je ne peux pas utiliser la gestion d'erreur puisque j'obtient cette erreur
qu'une fois le fichier fermé...

Je souhaiterais donc savoir s'il existe un moyen de tester si le fichier
n'est pas déjà ouvert avant de lancer l'export pour pouvoir le signaler à
l'utilisateur au lieu de tout bloquer...

Merci d'avance pour vos conseils...

A+





Avatar
Fabrice N.
Bonjour Thierry (ze Titi),

Merci pour ton aide, en fait, dan mon cas, ta macro ne fonctionne
pas...
Même avec Excel ouvert, la variable xl ne prend pas l'objet. Es-tu sûr
qu'il faut un createobject ?

Par contre, tu m'as mis sur la voie ce qui était déjà pas si mal.
RV à fini le boulot gâce au lien. Un grand merci à toi aussi RV.

Du coup, je me suis permis de bricoler vos 2 solutions ce quid donne :

#####
Function cherche(nomFichier As String) As Boolean

Dim xl As Object
Dim wb As Excel.Workbook

On Error Resume Next
Set xl = GetObject(, "Excel.Application")

If Err.Number = 0 Then
cherche = False
For Each wb In xl.Workbooks
If wb.Name = nomFichier Then cherche = True
Next
End If
Err.Clear
Set wb = Nothing
Set xl = Nothing

End Function
#####

et ça, ça marche aux petites ognion... ;-)
Donc un grand merci à vous 2 pour votre aide.

Maintenant, j'ose aller plus loin ?
Si j'ouvre le fichier sous excel, access le détecte nickel...
Par contre, si le fichier est ouvert via un document Word pour du
publipostage, je ne le détecte pas...

Vous avez une idée ?
Quand j'essai d'ouvrir le fichier via excel, j'ai le message d'alerte
qui permet d'être notifier ou d'ouvir le fichier en lecture seule. Je
me dis donc qu'il y a peut-être moyen de récupérer cette info quelque
part, non ?

.../...

Mieux:

Function cherche(nomFichier As String) As Boolean
Dim xl As Excel.Application
Set xl=CreateObject("Excel.Application")
Dim wb As Excel.Workbook
chercheúlse
For Each wb In xl.Workbooks
If wb.Name = nomFichier Then
cherche=True
End If
Next
Set wb=Nothing
Set xl=Nothing
End Function



Dans ton message du mardi 23/10/2007 jour
de Saint Jean de Capistran., tu as pris l'initiative de nous narrer les faits
suivants:
Bonjour à tous,

Sous Access 2003.

Via VBA, je fais un export via la command DoCmd.TransferSpreadsheet.
Si le fichier est ouvert au moment de cet export, l'appli se bloque et
semble tourner en rond. Si je ferme le fichier, j'obtient une erreur.
Je ne peux pas utiliser la gestion d'erreur puisque j'obtient cette erreur
qu'une fois le fichier fermé...

Je souhaiterais donc savoir s'il existe un moyen de tester si le fichier
n'est pas déjà ouvert avant de lancer l'export pour pouvoir le signaler à
l'utilisateur au lieu de tout bloquer...

Merci d'avance pour vos conseils...

A+




Avatar
Rv
C'est aussi ce que j'ai pensé dans un premier temps. J'ai donc essayé la
bibliothèque "Microsoft Scripting Runtime" qui permet la manipulation de
fichiers mais contrairement à mes attentes, je n'ai pas trouvé d'instruction
permettant de tester si le fichier est déjà ouvert.
Pourtant je continue à penser comme toi qu'il doit exister un moyen... API?
Fonction native de VBA pour la manipulation de fichiers? Autre
bibliothèque?...
Si tu as une solution le retour d'experience m'interesse! Si j'ai un peu de
temps je regarderai ce soir (ce n'est pas gagné je crois qu'il y a apéro au
programme!)


A+

Rv


"Fabrice N." <"fabrice.n.surlenet" avec l'@ chez free> a écrit dans le
message de news:
Bonjour Thierry (ze Titi),

Merci pour ton aide, en fait, dan mon cas, ta macro ne fonctionne pas...
Même avec Excel ouvert, la variable xl ne prend pas l'objet. Es-tu sûr
qu'il faut un createobject ?

Par contre, tu m'as mis sur la voie ce qui était déjà pas si mal.
RV à fini le boulot gâce au lien. Un grand merci à toi aussi RV.

Du coup, je me suis permis de bricoler vos 2 solutions ce quid donne :

#####
Function cherche(nomFichier As String) As Boolean

Dim xl As Object
Dim wb As Excel.Workbook

On Error Resume Next
Set xl = GetObject(, "Excel.Application")

If Err.Number = 0 Then
cherche = False
For Each wb In xl.Workbooks
If wb.Name = nomFichier Then cherche = True
Next
End If
Err.Clear
Set wb = Nothing
Set xl = Nothing

End Function
#####

et ça, ça marche aux petites ognion... ;-)
Donc un grand merci à vous 2 pour votre aide.

Maintenant, j'ose aller plus loin ?
Si j'ouvre le fichier sous excel, access le détecte nickel...
Par contre, si le fichier est ouvert via un document Word pour du
publipostage, je ne le détecte pas...

Vous avez une idée ?
Quand j'essai d'ouvrir le fichier via excel, j'ai le message d'alerte qui
permet d'être notifier ou d'ouvir le fichier en lecture seule. Je me dis
donc qu'il y a peut-être moyen de récupérer cette info quelque part, non ?

.../...

Mieux:

Function cherche(nomFichier As String) As Boolean
Dim xl As Excel.Application
Set xl=CreateObject("Excel.Application")
Dim wb As Excel.Workbook
chercheúlse
For Each wb In xl.Workbooks
If wb.Name = nomFichier Then
cherche=True
End If
Next
Set wb=Nothing
Set xl=Nothing
End Function



Dans ton message du mardi 23/10/2007
jour de Saint Jean de Capistran., tu as pris l'initiative de nous narrer
les faits suivants:
Bonjour à tous,

Sous Access 2003.

Via VBA, je fais un export via la command DoCmd.TransferSpreadsheet.
Si le fichier est ouvert au moment de cet export, l'appli se bloque et
semble tourner en rond. Si je ferme le fichier, j'obtient une erreur.
Je ne peux pas utiliser la gestion d'erreur puisque j'obtient cette
erreur qu'une fois le fichier fermé...

Je souhaiterais donc savoir s'il existe un moyen de tester si le fichier
n'est pas déjà ouvert avant de lancer l'export pour pouvoir le signaler
à l'utilisateur au lieu de tout bloquer...

Merci d'avance pour vos conseils...

A+








Avatar
Fabrice N.
Bonjour Rv,
C'est aussi ce que j'ai pensé dans un premier temps. J'ai donc essayé la
bibliothèque "Microsoft Scripting Runtime" qui permet la manipulation de
fichiers mais contrairement à mes attentes, je n'ai pas trouvé d'instruction
permettant de tester si le fichier est déjà ouvert.
Pourtant je continue à penser comme toi qu'il doit exister un moyen... API?
Fonction native de VBA pour la manipulation de fichiers? Autre
bibliothèque?...
Si tu as une solution le retour d'experience m'interesse! Si j'ai un peu de
temps je regarderai ce soir (ce n'est pas gagné je crois qu'il y a apéro au
programme!)


A+

Rv


Pas de problème, si je trouve quelque chose, je reviendrais poster.
Merci pour ton aide.

A ta place, je mettrais l'apéro en tête des priorités... ;-)
Il ne faut jamais se laisser abattre... Et pis des fois, on réfléchit
mieux dans un état second... ;-)
Par contre, attention, on bacule vite de l'état second à un autre état
un peu moins propice à la réflexion...

Et comme dirais l'autre, boire avec modération... etc... ;-)

Avatar
Rv
On est bien d'accord sur les priorités! :-)

Par contre je viens de faire un petit test qui pourrait convenir:
Le code suivant provoque une erreur si le fichier est déjà ouvert dans excel
et pas d'erreur sinon :

fileNumber = FreeFile
Open strChemin For Output As #fileNumber
close #fileNumber

A+

Rv


"Fabrice N." <"fabrice.n.surlenet" avec l'@ chez free> a écrit dans le
message de news:
Bonjour Rv,
C'est aussi ce que j'ai pensé dans un premier temps. J'ai donc essayé la
bibliothèque "Microsoft Scripting Runtime" qui permet la manipulation de
fichiers mais contrairement à mes attentes, je n'ai pas trouvé
d'instruction permettant de tester si le fichier est déjà ouvert.
Pourtant je continue à penser comme toi qu'il doit exister un moyen...
API? Fonction native de VBA pour la manipulation de fichiers? Autre
bibliothèque?...
Si tu as une solution le retour d'experience m'interesse! Si j'ai un peu
de temps je regarderai ce soir (ce n'est pas gagné je crois qu'il y a
apéro au programme!)


A+

Rv


Pas de problème, si je trouve quelque chose, je reviendrais poster.
Merci pour ton aide.

A ta place, je mettrais l'apéro en tête des priorités... ;-)
Il ne faut jamais se laisser abattre... Et pis des fois, on réfléchit
mieux dans un état second... ;-)
Par contre, attention, on bacule vite de l'état second à un autre état un
peu moins propice à la réflexion...

Et comme dirais l'autre, boire avec modération... etc... ;-)






Avatar
Gelos64
Tester si un fichier est accessible.
Fonction utilisant les API

Si je puis me permettre, en passant par les api
on tante d'ouvrir le fichier en mode exclusif, si c'est possible le fichier
n'est pas ouvert


Private Declare Function lopen Lib "kernel32" Alias "_lopen" (ByVal
lpPathName As String, ByVal iReadWrite As Long) As Long
Private Declare Function lclose Lib "kernel32" Alias "_lclose" (ByVal hFile
As Long) As Long

Private Function TestFileOuvert(FileToOpen As String) As Boolean
' True : le fichier est ouvert par une appli
' False : le fichier n'est pas ouvert

Dim hFile As Long
TestFileOuvert = False
hFile = -1

'Ouvre le fichier en mode exclusif
hFile = lopen(FileToOpen, &H10)

If hFile <> -1 Then
'fermeture du fichier si tout se passe bien
lclose (hFile)
ElseIf (hFile = -1) And (Err.LastDllError = 32) Then
TestFileOuvert = True
End If

End Function





"Fabrice N." <"fabrice.n.surlenet" avec l'@ chez free> a écrit dans le
message de news:
Bonjour à tous,

Sous Access 2003.

Via VBA, je fais un export via la command DoCmd.TransferSpreadsheet.
Si le fichier est ouvert au moment de cet export, l'appli se bloque et
semble tourner en rond. Si je ferme le fichier, j'obtient une erreur.
Je ne peux pas utiliser la gestion d'erreur puisque j'obtient cette erreur
qu'une fois le fichier fermé...

Je souhaiterais donc savoir s'il existe un moyen de tester si le fichier
n'est pas déjà ouvert avant de lancer l'export pour pouvoir le signaler à
l'utilisateur au lieu de tout bloquer...

Merci d'avance pour vos conseils...

A+




Avatar
Fabrice N.
Bonjour Gelos64,
Tester si un fichier est accessible.
Fonction utilisant les API

Si je puis me permettre, en passant par les api
on tante d'ouvrir le fichier en mode exclusif, si c'est possible le fichier
n'est pas ouvert


Private Declare Function lopen Lib "kernel32" Alias "_lopen" (ByVal
lpPathName As String, ByVal iReadWrite As Long) As Long
Private Declare Function lclose Lib "kernel32" Alias "_lclose" (ByVal hFile
As Long) As Long

Private Function TestFileOuvert(FileToOpen As String) As Boolean
' True : le fichier est ouvert par une appli
' False : le fichier n'est pas ouvert

Dim hFile As Long
TestFileOuvert = False
hFile = -1

'Ouvre le fichier en mode exclusif
hFile = lopen(FileToOpen, &H10)

If hFile <> -1 Then
'fermeture du fichier si tout se passe bien
lclose (hFile)
ElseIf (hFile = -1) And (Err.LastDllError = 32) Then
TestFileOuvert = True
End If

End Function


Super ! C'est exactement ce que je cherchais...

En plus, j'ai l'info meêm i le fichier est ouvert sur un autre poste...
La cerise... ;-)

Un grand merci à toi Gelos64...

Rv, si tu passes par là, voilà une fonction qui devrait t'intéresser...

A+

Avatar
Rv
Salut,

J'ai bien vu et je n'ai pas testé mais j'ai archivé car en effet c'est
bon à prendre. Les bienfaits du forum!

A+

Rv

"Fabrice N." <"fabrice.n.surlenet" avec l'@ chez free> a écrit dans le
message de news:
Bonjour Gelos64,
Tester si un fichier est accessible.
Fonction utilisant les API

Si je puis me permettre, en passant par les api
on tante d'ouvrir le fichier en mode exclusif, si c'est possible le
fichier n'est pas ouvert


Private Declare Function lopen Lib "kernel32" Alias "_lopen" (ByVal
lpPathName As String, ByVal iReadWrite As Long) As Long
Private Declare Function lclose Lib "kernel32" Alias "_lclose" (ByVal
hFile As Long) As Long

Private Function TestFileOuvert(FileToOpen As String) As Boolean
' True : le fichier est ouvert par une appli
' False : le fichier n'est pas ouvert

Dim hFile As Long
TestFileOuvert = False
hFile = -1

'Ouvre le fichier en mode exclusif
hFile = lopen(FileToOpen, &H10)

If hFile <> -1 Then
'fermeture du fichier si tout se passe bien
lclose (hFile)
ElseIf (hFile = -1) And (Err.LastDllError = 32) Then
TestFileOuvert = True
End If

End Function


Super ! C'est exactement ce que je cherchais...

En plus, j'ai l'info meêm i le fichier est ouvert sur un autre poste...
La cerise... ;-)

Un grand merci à toi Gelos64...

Rv, si tu passes par là, voilà une fonction qui devrait t'intéresser...

A+