FORUM Tom's Hardware » Programmation » VB / VBA / VBS » Comment savoir qu'un fichier excel est ouvert?
 

Comment savoir qu'un fichier excel est ouvert?

Il y a 351 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : Comment savoir qu'un fichier excel est ouvert?
 
Plus d'informations

Bonjour à tous,
 
J'ai une macro qui à un moment donné, ouvre un classeur excel.
Dès que ce classeur est ouvert, il passe en 1er plan.
Je voudrais que dès que je le ferme, ma macro reprenne ses fonctions.
En fait il faudrait que ma macro puisse sruter le moment où le fichier excel se ferme.
 
Je vois pas du tout comment faire.
 
 
 

zeb
Profil : Modérateur libre
Plus d'informations

Impossible ( de façon simple, parce qu'il y a toujours moyen :) ).
 
Si tu t'en sens le courage, on peut chercher ensemble une soluce hardcore.

Je me la pête
Profil : /!\ Docteur - PDG
Plus d'informations

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

Plus d'informations

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

pourquoi faire cent fois la même chose ?
Plus d'informations

ta boucle va faire rammer excel aussi ...

zeb
Profil : Modérateur libre
Plus d'informations

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

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


Message édité par zeb le 23-11-2006 à 18:44:17
Plus d'informations

Zeb, je vais peut etre parraitre pour un nul, mais je comprends rien au code.
On ouvre notre fichier (filename) et on le referme juste après?
S'il te plait peux tu expliquer le code? :)

zeb
Profil : Modérateur libre
Plus d'informations

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


Message édité par zeb le 18-01-2007 à 12:00:30
Plus d'informations

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. :)  

Plus d'informations

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

Code :
  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. On Error Resume Next
  7. Open path_macro + "\toto.xls" For Input Lock Read As #1
  8. Close #1
  9. theerror = Err  ' comme notre fichier est ouvert theerror=70
  10. While theerror = 70 ' je boucle tant que c062.xls est ouvert
  11.     Open path_macro + "\toto.xls" For Input Lock Read As #1
  12.     Close #1
  13.     theerror = Err
  14. Wend
  15. On Error GoTo 0
  16. 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?

G.M.G.V.S.O.
Profil : Modo matériel
Plus d'informations

Bin vu que tu ne retestes pas dans ta boucle, ta variable ne varie pas ...
 
edit: enfait si, désolé  :sweat:


Message édité par boub popsy team le 28-11-2006 à 18:40:10

---------------
SPAM & WAREZ = Ban!
Ultimate Boot CD | Memtest+
Mon bar préféré à Lyon ! | Bijoux Fantaisie de Créateur !
zeb
Profil : Modérateur libre
Plus d'informations

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]

Plus d'informations

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+

zeb
Profil : Modérateur libre
Plus d'informations

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

a écrit :

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.

Plus d'informations

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

Code :
  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à?

zeb
Profil : Modérateur libre
Plus d'informations

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 :

Code :
  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/

Plus d'informations

Si j'ai bien compris mon code est correct (mis à par le fait que je n'ai pas utilisé de fontion mais je vais faire le nécessaire afin d'assouvir les desirs de sa majesté :))
 
Merci beaucoup et a bientot.

zeb
Profil : Modérateur libre
Plus d'informations

:)
 
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 ;)


Aller à :
Ajouter une réponse
  FORUM Tom's Hardware » Programmation » VB / VBA / VBS » Comment savoir qu'un fichier excel est ouvert?
 

Annonces Google
Publicité
Les ressources relatives