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.
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.
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...
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 :
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?
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...
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.
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
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+
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.
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 :
While theerror = 70
PauseTime = 1 ' Définit la durée.
Start = Timer ' Définit l'heure de début.
Do While Timer < Start + PauseTime
DoEvents ' Donne le contrôle à d'autres processus.
Loop
Err.Clear
FileNum = FreeFile()
Open path_macro + "\toto.xls" For Input Lock Read As #FileNum
Close #FileNum
theerror = Err
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
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é )
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.