Se connecter avec
S'enregistrer | Connectez-vous

vérifier si un fichier est déja ouvert

Dernière réponse : dans Programmation

Bonjour,
Je voudrais savoir comment vérifier qu'un fichier est ouvert.
En effet, j'aimerais lancer une macro d'export vers un fichier précis(D:\toto.xls) mais si celui est déja ouvert ou utilisé ma macro d'export ne fonctionne pas et mon logiciel plante

Le bur de savoir si ce fichier est ouvert est de pouvoir le fermer l'application Excel qui lui correspond (car fichier masqué) si l'utilisateur ouvre un autre fichier excel bah il aura un fenpere vide.

Merci de votre aide

Autres pages sur : verifier fichier ouvert

Lassé par la pub ? Créez un compte

Bonsoir
Function VerifOuvertureClasseur(Fichier As String) As Boolean
Dim n As Integer
On Error Resume Next
n = FreeFile()
Open Fichier For Input Lock Read As #n
Close n
If Err.Number = 0 Then VerifOuvertureClasseur = False
If Err.Number = 70 Then VerifOuvertureClasseur = True
On Error GoTo 0
End Function
Expert Programmation

Mais quelle horreur !!!!!!!!!! Kiki, ton code fonctionne, et tu réponds exactement à la question de darksoilt. C'est ça le pire.

Mais bon sang, apprenez à coder proprement. Quand on ouvre une session, un fichier, on en garde un descripteur pour pouvoir le fermer proprement.

Pour vérifier si Excel tient un fichier, on parcourt toutes les sessions pour trouver laquelle.

En plus, GetObject() le fait pour nous.

j'ai retrouvé l'origine de ce code, dans la FAQ de Developpez.com , donc va le leur dire, à mon avis ils ont un autre niveau que ce forum avec son mutawa ( police religieuse en Arabie Saoudite ).Tu peux me rayer des cadres, je quitte définitivement ce forum
Expert Programmation

Tant pis pour toi, tant pis pour nous.
Bye. Bye.

Je le répète, un mutawa aurait non seulement supprimé ton message mais en plus, il t'aurait banni. Il ne me semble pas que j'ai fait l'un ou l'autre.

___________________________


Taper au petit bonheur la chance en espérant provoquer une erreur ou pas est une façon de programmer particulièrement crade.

Par ailleurs, VB possède de grosses lacunes. De nombreux cas doivent donc être traités par des astuces plus ou moins sales. La FAQ de développez.com propose de telles astuces et il n'est pas malsain de s'en inspirer, ni même de les exploiter telle quelles.

En revanche, quand une solution propre et efficace existe, c'est elle qu'il faut implémenter.

Coder propre, c'est un ensemble de principes qui permettent d'obtenir des applications efficientes, facile à maintenir, facile à débugger. Les virus et autres malwares ne prolifèrent que parce que les programmes sont vite faits, mal faits, sans aucune précaution, ni réflexion. Au niveau d'une petite macro en VBA, cela peut sembler anodin, c'est un tel état d'esprit que je ne peux m'empêcher de le signaler.

Citation :
Mais bon sang, apprenez à coder proprement

En m'insurgeant ainsi, je ne m'attaquais pas à Kiki en particulier, mais à la tendance générale. Si certains se sentent visés, qu'ils y réfléchissent plutôt que de fuir.

Dommage que kiki le prenne comme ca

Sinon j'ai essayé son code cela fonctionne

  1. If ouvert Then
  2. ' Workbooks("C:\Temp\e_analyse_croisée.xls").Close SaveChanges:=False
  3. Set utilise = GetObject("C:\Temp\e_analyse_croisée.xls") utilise.Close
  4. End If


le probleme c'est que mon classeur se ferme et pas mon appli
comment mettre le getobcject en lien avec appli
appli est déclaré comme suivant
  1. dim appli as Excel.application
Expert Programmation

Set utilise = GetObject("C:\Temp\e_analyse_croisée.xls" )

Comment as-tu déclaré ton objet utilise ?
[ ] Pas de déclaration, je n'utilise pas l'Option Explicit
[ ] Dim utilise As Variant
[ ] Dim utilise As Workbook

(Si jamais tu me coches la première case, je boycotte tes questions :fou:  )

Dans les autre cas, voici un exercice :
  1. Dim utilise As Variant
  2. Stop
  3. Set utilise = GetObject("C:\Temp\e_analyse_croisée.xls" )
  4. Stop


Ouvre dans une autre session Excel le fichier e_analyse_croisée.
Puis exécuter ce petit code. Le debugger devrait s'arrêter sur la ligne 2.
Ajoute utilise aux espions. (Affichage > Fenêtre Espions)
Tu devrais voir une variable vide de type Variant.
Appuie sur F5, la ligne 3 s'exécute, puis le débugger s'arrête de nouveau, ligne 4. Observe ta variable utilise dans la fenêtre Espions. Elle est de type Workbook. On aurait donc pu commencer par là !! :) 

Clique sur le + et parcours les propriétés de ton objet. Comme tout objet de type Workbook, utilise pointe vers l'instance d'Excel qui l'a chargé. Donc pour fermer :
  1. Dim xl_a_fermer As Excel.application
  2. Dim wk_a_fermer As Workbook
  3. Dim wb As Workbook
  4. Dim OnFerme As Boolean
  5.  
  6. On Error Resume Next
  7. Set wk_a_fermer = GetObject("chemin/fichier.xls")
  8. If IsEmpty(wk_a_fermer) Then MsgBox "Pas trouvé. Faut faire quelque chose là !"
  9. On Error Goto 0
  10.  
  11. Set xl_a_fermer = wk_a_fermer.Application
  12. wk_a_fermer.Close
  13.  
  14. ' // A priori
  15. OnFerme = True
  16. ' // Mais vérifier s'il ne reste pas un autre classeur ouvert dans cette instance d'Excel !!!!
  17. For Each wb In xl_a_fermer.Workbooks
  18. Debug.Print wb.Name
  19. ' // Il reste des trucs ouverts !!!
  20. ' // Vérifier de quoi il s'agit (PERSO.XLS par exemple) et décider si on peut fermer ou pas
  21. OnFerme = False
  22. Next
  23. If OnFerme Then xl_a_fermer.Quit

j'ai déclaré utilise comme suivant

  1. Dim utilise as Workbook


Je veux bien etre des fois crade mais il y a des limites

Sinon je ne sais pas pkoi mais il ne rentre pas ds ta boucle each

en tout cas c'était la ligne

  1. set appli = utilise.application


mais ta méthode each ne fonctionne pas ca ne veut pas rentrer ds la boucle j'essai de voir pkoi mais je ne voit pas
Expert Programmation

  1. Dim utilise as Variant
  2. Set utilise = GetObject("chemin/fichier.xls" )

Ce n'est pas forcément crade. Pour une fois.
Cela dépend du contexte.
Imagine que l'utilisateur choisisse un classeur nommé fichier.doc !
(Quel con cet utilisateur :pfff: )

Donc le fichier pourra être ouvert et on pourra ensuite vérifier qu'il s'agit bien d'un classeur Excel.

-----------------------

Une instance d'Excel peut contenir plusieurs classeurs.
S'il ne rentre pas dans la boucle, c'est que tout va bien, il n'y a avait que le classeur à fermer dans cette instance d'Excel.

En regardant mieux le code proposé, j'aperçois un ptit bug. Il faut sortir la ligne 19 de la boucle et la mettre avant la ligne 14. Ben, oui, sinon la variable n'est pas initialisée :/ 
(Quel con ce zeb :pfff: )
Expert Programmation

[:patch]

Au choix :

  • Je le fais exprès pour voir si tu suis :o 

  • En fonction de l'heure à laquelle je réponds, je peux tester, sinon, je le fais de mémoire :( 

    J'édite...
    Lassé par la pub ? Créez un compte