Vérifier si fichier excel ouvert
Résolu
Nico
-
Nico -
Nico -
Bonjour,
j'utilise un userform comme moteur de recherche.
une fois la recherche lancée j'ai ce code qui m'ouvre une base de données excel en lecture seule pour éviter les mauvaises manip
voici le code
monfichier = "C:\mesdocuments\dossier\fichier\basededonnees.xlsm"
Application.Workbooks.Open Filename:=monfichier, ReadOnly:=True
jusque là aucun soucis
par contre si j'effectue uen seconde recherche, la macro me ferme la base de données pour me la rouvrir immédiatement.
Serait il possible que la macro vérifie si le fichier est déjà ouvert en lecture seule et dans ce cas elle passe à la suite, sinon elle l'ouvre comme actuellement.
Si vous pouviez me dire le code à utiliser.
Merci de votre aide
j'utilise un userform comme moteur de recherche.
une fois la recherche lancée j'ai ce code qui m'ouvre une base de données excel en lecture seule pour éviter les mauvaises manip
voici le code
monfichier = "C:\mesdocuments\dossier\fichier\basededonnees.xlsm"
Application.Workbooks.Open Filename:=monfichier, ReadOnly:=True
jusque là aucun soucis
par contre si j'effectue uen seconde recherche, la macro me ferme la base de données pour me la rouvrir immédiatement.
Serait il possible que la macro vérifie si le fichier est déjà ouvert en lecture seule et dans ce cas elle passe à la suite, sinon elle l'ouvre comme actuellement.
Si vous pouviez me dire le code à utiliser.
Merci de votre aide
A voir également:
- Vérifier si fichier excel ouvert
- Fichier bin - Guide
- Fichier epub - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans system - Guide
- Fichier rar - Guide
- Si ou excel - Guide
3 réponses
Bonjour,
Tu peux générer et gérer l'erreur :
eric
Tu peux générer et gérer l'erreur :
fich = "D:\tmp\test.xls"
On Error Resume Next
If IsError(s = Workbooks("test.xls").Name) Then
On Error GoTo 0
Application.Workbooks.Open Filename:=fich, ReadOnly:=True
End If
On Error GoTo 0
eric
je ne vais pas pouvoir vous répondre si ça fonctionne de suite car on m'a donné d'autre priorité
je vous tiens au courant, je le ferai les essais au calme pour éviter les bêtises
je vous tiens au courant, je le ferai les essais au calme pour éviter les bêtises
bon j'ai découvert un truc qui a faussé mon premier essai.
initialement je faisais une boucle sur chaque feuille de ma base de données en regardant si le contenu de la cellule A1 correspondait à la feuille que je cherchais.
sauf que j'avais changé avant ce post en introduisant uen fonction qui me permet de faire cette recherche de feuille directement sur le nom de la feuille. Mais avec cette fonction faut impérativement que les majuscules soient respectées sinon message indiquant que la feuille n'existe pas.
voilà pourquoi ta proposition me mettait systématiquement ce message mais ça n'avait rien à voir avec ta solution.
donc je vais revenir au statut initial et je testerai vos 2 propositions en vous donnant le résultat
initialement je faisais une boucle sur chaque feuille de ma base de données en regardant si le contenu de la cellule A1 correspondait à la feuille que je cherchais.
sauf que j'avais changé avant ce post en introduisant uen fonction qui me permet de faire cette recherche de feuille directement sur le nom de la feuille. Mais avec cette fonction faut impérativement que les majuscules soient respectées sinon message indiquant que la feuille n'existe pas.
voilà pourquoi ta proposition me mettait systématiquement ce message mais ça n'avait rien à voir avec ta solution.
donc je vais revenir au statut initial et je testerai vos 2 propositions en vous donnant le résultat
Bonjour,
de retour après essai et ça fonctionne avec ta proposition eriiic.
j'ai simplement rajouté
Workbooks("monfichier.xlsm").Activate après
On Error GoTo 0
concrètement je gagne 36 secondes à chaque nouvelle recherche vu que j'ai chronométré le temps d'accès entre la lancement de la recherche et la possibilité d'utiliser ma base de données. ça prend 36 secondes
par curiosit&é j'ai testé la différence entre la recherche direct sur le nom de la feuille (36s) et avec l'ancienne méthode en lisant le contenu de chaque cellule A1 et ça prend 51s ... gain de temps indéniable
Merci à vous pour votre aide
de retour après essai et ça fonctionne avec ta proposition eriiic.
j'ai simplement rajouté
Workbooks("monfichier.xlsm").Activate après
On Error GoTo 0
concrètement je gagne 36 secondes à chaque nouvelle recherche vu que j'ai chronométré le temps d'accès entre la lancement de la recherche et la possibilité d'utiliser ma base de données. ça prend 36 secondes
par curiosit&é j'ai testé la différence entre la recherche direct sur le nom de la feuille (36s) et avec l'ancienne méthode en lisant le contenu de chaque cellule A1 et ça prend 51s ... gain de temps indéniable
Merci à vous pour votre aide
j'avais tenté de contourner ça avec la gestion d'erreur mais je n'ai aucune erreur, je pense que ça doit venir du fait que je lui impose la lecture seule. au début je n'imposais pas la lecture seule et effectivement j'avais une erreur qui se déclenchait si la base était ouverte, là ce n'est plus le cas :-(
Et en résumé ça marche pour toi ? si oui met en résolu
J'ai testé avant de poster, pour moi c'est ok...
Je déclenche l'erreur si non ouvert avec workbooks("xxx").name, pas en tentant de l'ouvrir
eric
En fait la difficulté vient du fait qu'il y a 2 instances d'excel
trouvé sur un autre forum
Option Explicit Dim objExcel As Excel.Application '--------------------------------------------------------------------------------------- ' Procédure : ClasseurEstOuvert ' Auteur : 2pme, Guy Courville ' Date : vendredi 11 février 2011 ' Détails : Le jeu consiste à ouvrir le classeur dans une instance invisible d'Excel ' et à tester la propriété ReadOnly de ce classeur. C'est la valeur de cette ' propriété qui est retournée par la fonction. ' ' Note 1 : Le paramètre strNomFichierComplet doit porter le chemin complet du classeur ' comme son nom l'indique. ' ' Note 2 : Aucun gestionnaire d'erreur n'est actif. ' '--------------------------------------------------------------------------------------- ' Function ClasseurEstOuvert(strNomFichierComplet As String) As Boolean Set objExcel = New Excel.Application With objExcel ' L'instance d'Excel qui porte le fichier ne doit pas être visible .Visible = False .Workbooks.Open (strNomFichierComplet) ' Si le classeur est déjà ouvert cette propriété sera à True ClasseurEstOuvert = .Workbooks(1).ReadOnly .Quit End With ' Ne pas oublier de supprimer la référence à Excel ' sinon une autre instance fantôme hantera votre système... Set objExcel = Nothing End FunctionChez moi il me l'ouvrait dans la même session, mais pourquoi pas...
Je dois m'absenter qcq jours encore, mes apparitions ici seront un peu plus rares.
A+ :+)
eric