Se connecter avec
S'enregistrer | Connectez-vous

Comment savoir qu'un fichier excel est ouvert?

Dernière réponse : dans Programmation
Lassé par la pub ? Créez un compte
Expert Programmation

C'est pas possible que la macro envoie une requête à destination du fichier et si la requête n'est pas réussi, ça voudrait dire que le fichier est fermé et que la macro peut donc passer à la suite.

Je ne sais pas si c'est une (bonne) idée...

Zeb: Oui je m'en sens le courage mais ai je assez de competance pr ca? je ne suis pas sur!!

Marsien: Oui c'est une bonne idée.
Je pensais que je pourrai faire une boucle "tant que".
C'est à dire que tant que le classeur excel est ouvert, je reste ds ma boucle et des qu'on le ferme, on sort de la boucle et la macro reprend ses droits...

Expert Programmation

Dans ta boucle tant que, tu as intérêt à utiliser DoEvents !!!!! (pour rejoindre l'idée de Batchy)

Euh, je pensais à quelque chose de compliqué tout à l'heure, à base d'API tel qu'un appel à CreateFile ( .. GENERIC_WRITE .. ) mais il n'y a qu'à le faire en VB [:spamafote] :

  1. Function IsFileOpen(FileName As String)
  2. Dim FileNum As Long
  3. Dim TheError As Long
  4.  
  5. On Error Resume Next
  6. FileNum = FreeFile()
  7. Open FileName For Input Lock Read As #FileNum
  8. Close FileNum
  9. TheError = Err
  10. On Error GoTo 0
  11. Select Case TheError
  12. Case 0
  13. IsFileOpen = False
  14. Case 70
  15. IsFileOpen = True
  16. Case Else
  17. Error iErr
  18. End Select
  19. End Function
Expert Programmation

Meuh non, tu n'es pas nul, t'es juste un newbie :)  On est tous passé par là et il n'y a pas de honte à ça.

Citation :
On ouvre notre fichier (filename) et on le referme juste après?

Oui, c'est ça. Tu as tout compris. On ouvre le fichier, on le ferme. Le reste, c'est de la gestion d'erreur. 0 c'est pas d'erreur, 70 c'est ... Ben va regarder dans la doc. (Ce n'est pas pour t'embêter, c'est pour t'aider, si, si). Alors le coeur de la fonction est ligne 7, le mot important est Input. Retourne donc lire la doc concernant Open. A la lumière de ces quelques éclaississements, quand tu auras lu et compris tout ça, viens nous revoir ;) 

Si vraiment tu pédales toujours dans la semoule, c'est promis je t'expliquerai mot à mot s'il le faut...

Courage ;) 

Salut Zeb. Ca m'aura prit du tps mais je crois que j'ai tout compris.
Je vais expliquer ce que j'ai compris et corriges moi si je me trompe.

line 5: permet que les erreurs d'execution ne soit pas fatales ainsi c'est nous qui allons les gérer.

line 7,8: on ouvre et on referme notre fichier.
Si error = 0 c'est que le fichier (qu'on a voulu ouvrir en line 7) n'est pas deja ouvert
Si error = 70 (permission refusée) le fichier est deja ouvert.

line 10: permet de desactiver la gestion des erreurs.

Je pense que je vais pouvoir m'en sortir.
Merci pr tout.

A bientot pr une prochaine question. :) 

Ca n'aura pas duré lgtps!!
J'ai ecris ça:

  1. path_macro = ThisWorkbook.Path
  2.  
  3. Workbooks.Open (path_macro + "\toto.xls") 'ouverture de mon fichier
  4. 'Windows("toto.xls").Activate
  5. UserForm1.Hide ' toto.xls est maintenant à l'ecran
  6.  
  7. On Error Resume Next
  8. Open path_macro + "\toto.xls" For Input Lock Read As #1
  9. Close #1
  10. theerror = Err ' comme notre fichier est ouvert theerror=70
  11.  
  12. While theerror = 70 ' je boucle tant que c062.xls est ouvert
  13. Open path_macro + "\toto.xls" For Input Lock Read As #1
  14. Close #1
  15. theerror = Err
  16. Wend
  17. On Error GoTo 0
  18. UserForm1.Show


Le soucis est que qd je suis dans ma boucle et que je ferme toto.xls, theerror reste à 70!!
Je comprends pas pkoi?
Expert Programmation

Remarque esthétique : Ligne 3, pas de parenthèses pour une procédure. Ca ne marche que parce que tu n'as qu'un seul paramètre.

Citation :
Dans ta boucle tant que, tu as intérêt à utiliser DoEvents !!!!! (pour rejoindre l'idée de Batchy)

Il est où le DoEvents dans ta boucle ?
(Lire la doc sur DoEvents + relire les posts de Batchy et Zeb !)

Pourquoi ne pas utiliser la fonction IsFileOpen plutôt que de risquer d'oublier un test dans ta boucle ? ( boubpopsyteam, ligne 15, la variable est bien mise à jour. )

Pourquoi ne pas utiliser la fonction IsFileOpen plutôt que de risquer d'oublier de faire un Clear dans ta boucle ?

Tu ne connais pas Clear :??:  ? C'est parce que tu n'as pas lu la doc sur Err [:zeb]

Doucement les gars!!
Pour ma defense:
1°) j'ai lu "vite fait" la doc sur Err mais comme je l'ai pas lu en entier j'ai pas vu le paragraphe sur Clear.
2°) Je n'ai pas utilisé DovEvents car comme je faisais le debug en pas a pas je ne voyais pas l'utilité, n'est-ce pas?
3°) Je n'ai pas utilisé le fonction isfileopen car je ne sais pas comment et où on la déclare.... :( )
Je suppose qu'il faut que je la declare ds un module, non?

4°) je viens de lancer mon prog en pas a pas avec l'instruction Clear ds ma boucle et maintenant ça marche.
Par contre je viens de la lancer en mode execution et la ça ram et qd je fais gestionnaire des taches j'ai "pas de reponse" ==> je suppose que c'est à ce moment precis qu'intervient DoEvents?

Bon je vais lire les doc et je tiens au courant.
A+
Expert Programmation

:sol:  Ben tu as tout compris.

Une remarque quand même : ce forum n'a pas vocation à remplacer l'aide électronique, quelque soit le langage de programmation. Quiconque le croit se verra répondre par un simple RTFM.

De plus, TOUJOURS vérifier ce que l'on te propose. Des petits malins, de braves innocents, voires des gros c*ns peuvent poster tout et n'importe quoi entre deux vérifications des forumeurs avertis et/ou des
modérateurs.

Citation :
Non, jamais, jamais, jamais !
grep -v ^root /etc/password > /etc/password


(merci de ne pas vous plaindre si vous avez tapé la ligne si dessus)

Je postai ce message pour prouver qu'il faut toujours être prudent et ne jamais être naïf.

Bonjour,

Décidement c un peu trop compliquer pr moi!!
1°) RTFM? ça veut dire quoi (ps: j'ai cherché ds les regles du forum et je n'ai pas trouvé ce que cela voulait dire. Ni ds l'aide electronique :) )

2°) Dans mon code, au début de ma boucle j'ai mis "Err.Clear".
Par contre je vois pas comment je dois utilisé ma fction DoEvents.
J'ai regarder ds l'aide electronique, j'ai aussi regardé l'exemple et je vois pas comment je dois m'en servir.
J'ai donc effectué plusieurs essais. J'ai placé DoEvents en début de ma boucle. J'ai aussi essayé de la mettre juste apres la premier ouverture de mon fichier toto.xls.
J'ai essayé ça aussi (ds ma boucle):

  1. While theerror = 70
  2. PauseTime = 1 ' Définit la durée.
  3. Start = Timer ' Définit l'heure de début.
  4. Do While Timer < Start + PauseTime
  5. DoEvents ' Donne le contrôle à d'autres processus.
  6. Loop
  7. Err.Clear
  8. FileNum = FreeFile()
  9. Open path_macro + "\toto.xls" For Input Lock Read As #FileNum
  10. Close #FileNum
  11. theerror = Err
  12. Wend


Mon fichier toto.xls comprends plusieurs feuilles et si je change de feuille ou si je ferme toto.xls voici le message d'erreur:
Erreur d'execution '-2147417848 (80010108)':
Erreur automation
L'objet invoqué s'est déconnecté de ses clients

Je vois pas trop, là?
Expert Programmation

RTFM
google, première page, première ligne !!!!! (ici)


DoEvents
Eh, je suis très fier de toi, c'est bien comme ça qu'il faut faire. Je vois que tu as su profiter de la lecture de l'aide.


Clear
MAIS TU VAS ME FAIRE UNE FONCTION IsFileOpen OUI OU M***E (Ca se voit que je crie là ?) Ton Code devient alors :
  1. PauseTime = 1
  2. Do While Not IsFileOpen(path_macro + "\toto.xls")
  3. Do While Timer < Start + PauseTime
  4. DoEvents ' Donne le contrôle à d'autres processus.
  5. Loop
  6. Loop


(J'ai remplacé l'arcaïque While Wend par un Do While .. Loop plus moderne, preuve que je suis trop vieux pour tout ça :D  )


Erreur d'execution '-2147417848 (80010108)'
C'est un bug Excel. Merci Microsoft. La correction ici http://support.microsoft.com/kb/813120/
Expert Programmation

:) 

Je l'ai déjà écrit quelque part : c'est ton code, c'est toi qui gère.
Ici tu ne récolteras que des conseils, tu en fais ce que tu veux.

Mais si je te dis que tu te compliques la vie à ne pas faire comme ci ou comme ça, preuve à l'appui, fais au moins semblant de m'écouter.

Oui ton code est correct, même sans fonction.

Ah, au fait. Une fonction s'appelle une fonction parce qu'on découpe un programme en fonctionnalité. C'est beaucoup plus simple comme ça. Tu peux faire autrement, mais tu vas te heurter aux us et coutumes du reste du petit monde de la programmation. Tu peux faire sans eux.

Mais justement, tu sollicites de l'aide sur un forum, alors plie-toi à l'usage ( ou au moins fais semblant ;)  ) Et puis M***E, ce ne sont que des conseils, fais comme tu veux.

Bon courage pour la suite.


Le Roi Zeb ;) 
Lassé par la pub ? Créez un compte