Exécuter un programme externe et attendre avant de continuer

Yunchi

XLDnaute Nouveau
Bonjour,

J'ai vu qu'on pouvait lancer un programme externe via la commande

Code:
Shell

Elle marche bien mais au lieu d'attendre que le programme externe se finisse avant de continuer, la macro exécute la suite des commandes sans attendre que cette application externe ne se finisse.

Est-ce qu'il existe une fonction qui attend la fin avant de continuer la macro ?

Est-ce que
Code:
ShellExecute
est très différent de
Code:
Shell
?

Merci
 

skoobi

XLDnaute Barbatruc
Re : Exécuter un programme externe et attendre avant de continuer

Bonjour,

pour répondre à ta question, ShellExecute n'existe pas sur excel 2003.
Tu as excel 2007?
Sinon, test en mettant DoEvents après la ligne Shell.....
 

Yunchi

XLDnaute Nouveau
Re : Exécuter un programme externe et attendre avant de continuer

Ah ok, bah non j'ai que excel 2003 ...

J'ai essayer avec DoEvents après le Shell mais ça ne fait rien de spécial

En gros pour tester je fais : Shell("prog") ensuite DoEvents et Cells(1,1) = "5" et donc dès que je lance la macro, la case A1 prend la valeur 5 alors que le programme tourne toujours :(

Sinon avec ShellExecute, ça attend la fin du programme avant de continuer ?
 

vbacrumble

XLDnaute Accro
Re : Exécuter un programme externe et attendre avant de continuer

Bonjour à tous


Skoobi: on peut utiliser ShellExcute (mais oui pas en natif dans VBA)

Exemple

Code:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
    (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
    ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
'*********************************************
Sub CLAVIERVIRTUEL()
Dim strOS$, tOS$: Dim RetVaL
strOS = Application.OperatingSystem
tOS = Trim(Mid(strOS, InStr(1, strOS, ")") + 1, 255))
    Select Case tOS
        Case "NT 6.00"
        ShellExecute 0, "open", "osk.exe", 0, 0, 1
        Case "NT 5.01"
        RetVaL = Shell("C:\WINDOWS\system32\osk.exe", 1)
    End Select
End Sub
 

Yunchi

XLDnaute Nouveau
Re : Exécuter un programme externe et attendre avant de continuer

Je radote je radote mais est-ce que la fonction ShellExecute permet de lancer un programme externe et met la macro en attente et continu lorsque l'on met fin au programme externe ? :)
 

vbacrumble

XLDnaute Accro
Re : Exécuter un programme externe et attendre avant de continuer

Bonjour



Application.Wait -> voir l'aide de VBA à ce sujet (touche F1)


Autrement, utilisez les outils dont regorge le net pour trouver l'information qui vous manque.

D.I.Y comme chantait Pet Gab.
 
Dernière édition:

Yunchi

XLDnaute Nouveau
Re : Exécuter un programme externe et attendre avant de continuer

J'ai regardé ce que fait Application.Wait sur le Net et ce n'est pas vraiment ce que je recherche. En fait le programme externe qui se lance aura des durées d'exécution qui varient ... Donc ce que je recherche est vraiment une fonction qui attende que l'exe externe se finisse pour continuer la macro.
 

vbacrumble

XLDnaute Accro
Re : Exécuter un programme externe et attendre avant de continuer

Re


Tu vois, qu'en cherchant un peu on trouve de l'info.


Cherche encore et tu trouveras.


D'autant plus que l'on pas vu l'ombre du début du code de ta macro ...
 
Dernière édition:

James007

XLDnaute Barbatruc
Re : Exécuter un programme externe et attendre avant de continuer

Si tu as une bonne estimation du temps d'attente Application.Wait fera le boulot ... sinon, pour avoir le temps d'attente exact, tu devras passer par
Windows API ...

A+
 

Yunchi

XLDnaute Nouveau
Re : Exécuter un programme externe et attendre avant de continuer

Bon si tu veux du code voilà la macro actuelle :

Code:
Sub analyser_fichier()

Path = Workbooks("Simulateur_RRC.xls").Path
Commande = Path + "\" + "file_analyzer.exe" + " " + Path
RetVal = Shell(Commande, 1)

DoEvents

Cells(21, 1) = "5"

End Sub

Je prends donc le répertoire puis je concatène l'adresse de mon exe. Je lance l'exe via Shell et la ça marche bien sauf que la macro n'attend pas la fin avant de faire la suite ... DoEvents ne marche pas non plus

Le Cells(21, 1) = "5" me sert de test pour voir si ça attend ou non la fin ...

Bref il y'a des choses qu'on peut trouver mais d'autre non quand on ne connait pas du tout le langage : /
 

Yunchi

XLDnaute Nouveau
Re : Exécuter un programme externe et attendre avant de continuer

Si tu as une bonne estimation du temps d'attente Application.Wait fera le boulot ... sinon, pour avoir le temps d'attente exact, tu devras passer par
Windows API ...

A+


L'exe externe que je lance analyse en fait un fichier txt qui peut varier considérablement donc pas d'estimation possible de la durée d'exécution du programme qui peut varier de quelques secondes à plusieurs heures :(

Donc déjà ma question est de savoir si une fonction attendant la fin d'un Shell existe et dans le pire des cas je passerais par un fichier intermédiaire qui contiendrait une variable indiquant si l'exe est fini ...
 

James007

XLDnaute Barbatruc
Re : Exécuter un programme externe et attendre avant de continuer

Je viens de farfouiller dans un de mes anciens fichiers ... et j'ai retrouvé cette fonction ... dont je ne sais plus la source ...

A tester ...

Code:
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _ 
  ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long 
Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, _ 
  lpExitCode As Long) As Long 

Function ShellAndLoop(ByVal CommandLine As String, _ 
  Optional ExecMode As Long = 6) As Long 
  'default mode is minimized with focus 
  Dim ProcessID As Long 
  Dim hProcess As Long 
  Dim nRet As Long 

'  Const PROCESS_QUERY_INFORMATION = &H400 
'  Const STILL_ACTIVE = &H103 
'  Const SW_HIDE = 0 
'  Const SW_SHOWNORMAL = 1 
'  Const SW_SHOWMINIMIZED = 2 
'  Const SW_SHOWMAXIMIZED = 3 
'  Const SW_SHOWNOACTIVATE = 4 
'  Const SW_SHOW = 5 
'  Const SW_SHOWNA = 8 
'  Const SW_MINIMIZE = 6 
'  Const SW_SHOWMINNOACTIVE = 7 
'  Const SW_RESTORE = 9 
  If ExecMode < 0 Or ExecMode > 9 Then ExecMode = 6 
  ProcessID = Shell(CommandLine, CLng(ExecMode)) 
  hProcess = OpenProcess(&H400, False, ProcessID) 
  Do 
    GetExitCodeProcess hProcess, nRet 
    DoEvents 
  Loop While nRet = &H103
  ShellAndLoop = nRet
End Function

A +
 

Discussions similaires

Statistiques des forums

Discussions
312 391
Messages
2 087 942
Membres
103 679
dernier inscrit
yprivey3