cs_faucheuse
Messages postés308Date d'inscriptionjeudi 10 janvier 2008StatutMembreDernière intervention27 octobre 2011
-
7 avril 2008 à 15:29
cs_faucheuse
Messages postés308Date d'inscriptionjeudi 10 janvier 2008StatutMembreDernière intervention27 octobre 2011
-
8 avril 2008 à 11:23
Rebonjour ami(e)s programmeurs et programmeuzes,
j'utilise des commandes DOS dans mon projet VBA et à chaque fois, pour laisser le temps au shell d'executer ce que je lui demande je met une temporisation de quelques secondes (qui varie de pas tres longtemps pour un tit telechargement a presque 30 secondes pour un netsh)
Or l'execution du shell est variable d'un ordinateur a l'autre, selon qu'il est deja ete lancé une fois ...
Donc j'aurais voulu savoir si il y avait un moyen de continuer l'execution du programme uniquement lorsque le shell a fini de travailler?? ou alors peut etre est ce plus simple de vérifier si une fenètre est ouvert ou non mais la non plus je ne sais pas comment faire.
PS : call shell(command\c), rapport a vérifier si une fenetre est ouverte ou pas.
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201314 7 avril 2008 à 20:22
Salut,
une autre solution :
Sub test()
Dim CMDAppli As Double , TestFichier As String
'on cree un fichier bidonqui ne sert qu'a verifié l'etat d'execution de la commande ping
CMDAppli = Shell("cmd.exe /c echo > c:\temp\bidon.txt", 0)
Do While TestFichier = "" 'on boucle tant que le fichier bidon n'est pas créé
TestFichier = Dir("c:\temp\bidon.txt")
DoEvents
Loop
'on lance une commande ping, puis on ecrit le resultat dans un fichier ResultatPing.txt et on efface le fichier bidon
'start /min /wait lance la commande ping dans une deuxieme cmd qui attendra que la commande ping soit terminé avant
'd'autoriser l'execution de la commande del. cette partie n'est pas obligatoire
'les 2 && permetent d'executer une 2ieme commande ecrite sur la meme ligne que la premiere
CMDAppli = Shell("cmd.exe /c start /min /wait ping www.vbfrance.com > c:\temp\ResutatPing.txt&&del c:\temp\bidon.txt", 0)
Do While TestFichier <> "" le fichier bidon ne sera effacé qu'une fois la commande ping terminé donc on boucle tant que le fichier existe
TestFichier = Dir("c:\temp\bidon.txt")
DoEvents
Loop
MsgBox "fin d'execution"
End Sub
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202172 8 avril 2008 à 10:08
ravi de voir que tu te dirige vers cette solution plus fiable (je dis pas caparce que j'ai posté cetet fonction)
les Declare permettent de donner accès à certaines fonctions (APIs) de Windows.
Entre autre ici, lancer un processus, attendre sa fin, libérer son handle (qui permet de le manipuler) ...
concernant les question spécifiques que tu as concernant lpVerb, faudrait potasser la doc MSDN:
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201314 7 avril 2008 à 20:33
oui ! copie de l'aide VBA Excel 2003 :
[javascript:hhobj_4.Click() Integer] representing the number of open
forms in stand-alone versions of Visual Basic, such as Visual Basic,
Professional Edition. DoEvents returns zero in all other
applications.
DoEvents passes control to the operating system. Control is
returned after the operating system has finished processing the events in its
queue and all keys in the SendKeys queue have been sent.
DoEvents is most useful for simple things like allowing a user
to cancel a process after it has started, for example a search for a file. For
long-running processes, yielding the processor is better accomplished by using a
Timer or delegating the task to an ActiveX EXE component.. In the latter case,
the task can continue completely independent of your application, and the
operating system takes case of multitasking and time slicing.
Caution Any time you temporarily yield the processor within
an event procedure, make sure the [javascript:hhobj_5.Click() procedure] is not executed again from a
different part of your code before the first call returns; this could cause
unpredictable results. In addition, do not use DoEvents if other
applications could possibly interact with your procedure in unforeseen ways
during the time you have yielded control.
oommeeggaa3d
Messages postés97Date d'inscriptiondimanche 24 avril 2005StatutMembreDernière intervention 3 septembre 2010 8 avril 2008 à 09:48
J'ai déja utilisé l'idée du fichier, ça marche bien.
Par contre j'y avais ajouté un timer ou un sleep( ) pour éviter de scanner en permanence l'existence du fichier, mais seulement toutes les secondes ou plus.
cs_faucheuse
Messages postés308Date d'inscriptionjeudi 10 janvier 2008StatutMembreDernière intervention27 octobre 2011 8 avril 2008 à 10:00
Euh...scusez moi, quelqu'un pourrait m'expliquer un peu le code de Renfield svp, par exemple le "lpverb" , les mask utilisés (je comprend pas trop pourquoi ils sont la), les 4 "public declare function", se sont mes principales questions (oui je sais que ca fait la moitié du code, mais faut bien XD)
cs_faucheuse
Messages postés308Date d'inscriptionjeudi 10 janvier 2008StatutMembreDernière intervention27 octobre 2011 8 avril 2008 à 11:08
Scuzez moi j'ai enore un tit probleme :
Lorsque je lance ma macro j'ai un message d'erreur : "Des constantes, chaines de longueur fixes, tableaux, typês définis par l'utilisateur et instructionsDeclare ne sont pas autorisés comm membres Public de modules objet".
Lorsque ce message s'affiche le compilateur surligne les constantes.
J'ai donc enlevé leur declaration en tant que constante, et les ai mise en declaration par défaut et est déclaré leur valeur dans la Sub.
Mais dans la fonction ExecCmd on a besoin de constante.
cs_faucheuse
Messages postés308Date d'inscriptionjeudi 10 janvier 2008StatutMembreDernière intervention27 octobre 2011 8 avril 2008 à 11:15
Lol c'est justement ce que je viens de penser a faire et ca fonctionne (faut aussi mettre la fonction en Private sinon il met : "Erreur interne") c'est normal que ca fasse ca??