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

Le
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+
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Thierry (ze Titi)
Le #6386621
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 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

Thierry (ze Titi)
Le #6386581
.../...

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 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

Rv
Le #6386561
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." 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+





Fabrice N.
Le #6386401
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 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+




Rv
Le #6386371
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." 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 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+








Fabrice N.
Le #6386361
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... ;-)

Rv
Le #6386351
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." 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... ;-)






Gelos64
Le #6385941
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." 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+




Fabrice N.
Le #6384351
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+

Rv
Le #6384161
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." 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+






Publicité
Poster une réponse
Anonyme