VBA : Contrôle de la fonction shell

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

pascal_bidouille

XLDnaute Junior
Bonjour,

J'utilise la fonction shell pour lancer un traitement erxterne dans une macro excel. Style :
Code:
str1 = Shell("monprogramme.exe", vbNormalFocus)

Le progremme se lance normalement mais je voudrai pouvoir attendre la fin de celui-ci avant de continuer ma macro.

Quelqu'un sait comment faire cela ?

Merci
 
Re : VBA : Contrôle de la fonction shell

Bonjour Pascal Bidouille, Catrice 🙂,
Il y a certainement plus simple, mais si j'ai bien compris, tu souhaites que la suite de ta macro s'exécute que losqu'Excel reprends le focus. Tu peux boucler sur la pause proposée par Catrice
Code:
Public Drapeau As Boolean
Sub Test()
' ...
Drapeau = False
Do While Drapeau = False
Application.Wait (Now + TimeValue("0:00:10"))
DoEvents
Loop
'...
End Sub
et basculer le drapeau à l'activation d'Excel
Code:
Private Sub Workbook_WindowActivate(ByVal Wn As Window)
Drapeau = True
End Sub
Bon courage 😎
 
Re : VBA : Contrôle de la fonction shell

Re,

Malheureusement, je ne crois pas.
L'aide dit ceci :

Note Par défaut, la fonction Shell exécute les autres programmes de manière asynchrone. Cela signifie qu'un programme lancé avec Shell peut ne pas s'exécuter entièrement avant que les instructions suivant la fonction Shell ne soient exécutées.

Il faudrait que le programme dans lequel sont les utilisateur puisse informer Excel que c'est fini.
 
Re : VBA : Contrôle de la fonction shell

bonjour tout le monde
je viens de faire un essai le programme lancé (la calculatrice) fonctionne tout de suite et de manière indépendante...
je suis aussi prôneur de la solution si elle existe...
d'avance merci à ceux qui cherche..
 
Re : VBA : Contrôle de la fonction shell

Salut,

J'ai finalement trouvé en continuant à fouiller le net :

Code:
Private Declare Function WaitForSingleObject Lib "kernel32" _
   (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" _
   (ByVal hObject As Long) As Long
   
Private Declare Function OpenProcess Lib "kernel32" _
   (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
    ByVal dwProcessId As Long) As Long


Private Const INFINITE = -1&
Private Const SYNCHRONIZE = &H100000

Private Sub Command1_Click()
    Dim iTask As Long, ret As Long, pHandle As Long
    iTask = Shell("notepad.exe", vbNormalFocus)
    pHandle = OpenProcess(SYNCHRONIZE, False, iTask)
    ret = WaitForSingleObject(pHandle, INFINITE)
    ret = CloseHandle(pHandle)
    MsgBox "Process Finished! Thank you"
End Sub
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour