Continuer le programme uniquement a la fin de l'execution d'un shell [Résolu]

cs_faucheuse
Messages postés
309
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
27 octobre 2011
- 7 avril 2008 à 15:29 - Dernière réponse : cs_faucheuse
Messages postés
309
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
27 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.
Afficher la suite 

Votre réponse

18 réponses

Meilleure réponse
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 7 avril 2008 à 18:14
3
Merci
http://www.vbfrance.com/codes/SHELLANDWAIT-EXECUTER-APPLICATION-ATTENDRE-FIN-RENVOYER-SON-CODE_34867.aspx



ciao...
BruNews, MVP VC++

Merci BruNews 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de BruNews
Meilleure réponse
bigfish_le vrai
Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Dernière intervention
20 novembre 2013
- 7 avril 2008 à 20:22
3
Merci
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

Vala

A+

Merci bigfish_le vrai 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de bigfish_le vrai
Meilleure réponse
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 8 avril 2008 à 10:08
3
Merci
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:

http://msdn2.microsoft.com/en-us/library/bb762154.aspx

et

http://msdn2.microsoft.com/en-us/library/bb759784(VS.85).aspx

...

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de Renfield
Meilleure réponse
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 8 avril 2008 à 10:15
3
Merci
tu dois copier les declare et const tout en haut, dans la partie 'declaration' de ton module.

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de Renfield
Meilleure réponse
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 8 avril 2008 à 11:11
3
Merci
mets les Declare et Const en Private

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de Renfield
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 7 avril 2008 à 20:25
0
Merci
Il y a DoEvents() en VBA ?

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
bigfish_le vrai
Messages postés
1839
Date d'inscription
vendredi 13 mai 2005
Dernière intervention
20 novembre 2013
- 7 avril 2008 à 20:33
0
Merci
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.

A+
Commenter la réponse de bigfish_le vrai
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 7 avril 2008 à 20:37
0
Merci
ok ok OUI suffisait.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 8 avril 2008 à 06:24
0
Merci
jolie boucle ^^
Commenter la réponse de Renfield
cs_faucheuse
Messages postés
309
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
27 octobre 2011
- 8 avril 2008 à 09:46
0
Merci
ok merci beaucoup minna, je vais voir ce que je peux faire avec ca, d'abord faut que je comprenne comment ca marche et c'est pas gagné XD.
Commenter la réponse de cs_faucheuse
oommeeggaa3d
Messages postés
98
Date d'inscription
dimanche 24 avril 2005
Dernière intervention
3 septembre 2010
- 8 avril 2008 à 09:48
0
Merci
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.
Commenter la réponse de oommeeggaa3d
cs_faucheuse
Messages postés
309
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
27 octobre 2011
- 8 avril 2008 à 10:00
0
Merci
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)

Merci d'avance
Commenter la réponse de cs_faucheuse
cs_faucheuse
Messages postés
309
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
27 octobre 2011
- 8 avril 2008 à 10:12
0
Merci
d'ailleurs quand j'essaye de l'integrer le compilateur me dit "il ne peut y avoir que des commentaires apres un End Function, End Sub...
Commenter la réponse de cs_faucheuse
cs_faucheuse
Messages postés
309
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
27 octobre 2011
- 8 avril 2008 à 10:13
0
Merci
ok merci, je m'en va potasser donc ^^

Dsl pour le post j'avais pas vu que tu avais repondu.

Encore merci
Commenter la réponse de cs_faucheuse
cs_faucheuse
Messages postés
309
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
27 octobre 2011
- 8 avril 2008 à 11:08
0
Merci
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.

Qu'est ce que je dois faire?
Commenter la réponse de cs_faucheuse
cs_faucheuse
Messages postés
309
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
27 octobre 2011
- 8 avril 2008 à 11:15
0
Merci
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??
Commenter la réponse de cs_faucheuse
Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
- 8 avril 2008 à 11:17
0
Merci
"normal" ... euh normallement non....
a voir, ce que tu as dans ton module...

m'enfin, si tu es parvenu a faire tourner la chose.
Commenter la réponse de Renfield
cs_faucheuse
Messages postés
309
Date d'inscription
jeudi 10 janvier 2008
Dernière intervention
27 octobre 2011
- 8 avril 2008 à 11:23
0
Merci
En tout cas merci beaucoup, ca me fait gagner une 20aine de secondes!
Commenter la réponse de cs_faucheuse

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.