Je dois faire appel à 2 applications (64 Ko pour la première et 3,5 Mo pour
la deuxième).
Le problème est que losque je fait appel à la première application, celle-ci
s'ouvre très rapidement et mes commandes SendKeys fonctionnent très bien.
Par contre, en ce qui concerne la deuxième application, celle-ci met un
certain temps à s'ouvrir et mes SendKeys sont souvent envoyés avant même que
l'application soit réellement lancée ce qui me génère une erreur de
récupération de données.
Ma question est simple (peut être moins en ce qui concerne la réalisation).
J'ai bien essayé de mettre une boucle d'attente, mais différents
utilisateurs doivent se sevrir de cette macro et tous les PC n'ont pas la
même vitesse d'exécution.
Bout de code :
Shell "C:\FicheAdre\PréparationCommande.exe",vbMaximizedFocus
Do
attente=attente + 1
Loop Until Attente > 5000
i=0
Do While Classe(i)<>"Fin"
SendKeys Classe(i),True
...
...
i=i+1
Loop
Comment savoir si l'application exécutée par la commande shell est
entièrement ouverte avcant de lancer les commandes SendKeys.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Pascal Engelmajer
Salut, à tout hasard : Option Explicit Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, _ lpExitCode As Long) As Long Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _ ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long ' Ferme une application extérieure Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, _ ByVal uExitCode As Long) As Long ' Ferme l'application Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long) Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare Function GetLastError Lib "kernel32" () As Long
'Constantes Const STILL_ACTIVE = &H103 Const PROCESS_QUERY_INFORMATION = &H400 Sub S(ByVal Tache As String) 'Crée une tache puis regarde si elle est active Dim hProcess As Long Dim RetVal As Long ' récupère le handle (hProcess) du programme ouvert par Shell hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(Tache, 1)) ' Regarde si il est actif If (hProcess <= 0) Then MsgBox "OpenProcess() a échoué : " & GetLastError() Else Do ' Retourne le status du processus en cours GetExitCodeProcess hProcess, RetVal 'évite de faire travailler le système avec GetExitCodeProcess DoEvents Debug.Print RetVal; "/"; Sleep 100 Loop Until RetVal = STILL_ACTIVE SendKeys "ok c'est bon", True ' si on veut attendre la fermeture du programme ' Do ' ' Retourne le status du processus en cours ' GetExitCodeProcess hProcess, RetVal ' 'évite de faire travailler le système avec GetExitCodeProcess ' DoEvents ' Debug.Print RetVal; "/"; ' Sleep 10 ' Loop While RetVal = STILL_ACTIVE End If 'si on veut fermer le programme If TerminateProcess(hProcess, 1) Then MsgBox "TerminateProcess() a échoué " & GetLastError() End If CloseHandle (hProcess) End Sub
Private Sub test() S ("c:WINDOWSnotepad.exe") End Sub
-- Amicalement. Pascal "il n'y a pas de vent favorable pour celui qui ne sait pas ou il va." Sénèque. http://www.ilyapa.net/excel http://www.ilyapa.net/baseExcel "Lolote" a écrit dans le message de news:
Bonjour à tous,
Je dois faire appel à 2 applications (64 Ko pour la première et 3,5 Mo pour
la deuxième).
Le problème est que losque je fait appel à la première application, celle-ci
s'ouvre très rapidement et mes commandes SendKeys fonctionnent très bien.
Par contre, en ce qui concerne la deuxième application, celle-ci met un certain temps à s'ouvrir et mes SendKeys sont souvent envoyés avant même que
l'application soit réellement lancée ce qui me génère une erreur de récupération de données.
Ma question est simple (peut être moins en ce qui concerne la réalisation).
J'ai bien essayé de mettre une boucle d'attente, mais différents utilisateurs doivent se sevrir de cette macro et tous les PC n'ont pas la même vitesse d'exécution.
Bout de code :
Shell "C:FicheAdrePréparationCommande.exe",vbMaximizedFocus Do attente=attente + 1 Loop Until Attente > 5000 i=0 Do While Classe(i)<>"Fin" SendKeys Classe(i),True ... ... i=i+1 Loop
Comment savoir si l'application exécutée par la commande shell est entièrement ouverte avcant de lancer les commandes SendKeys.
@+Lolote
Salut,
à tout hasard :
Option Explicit
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess
As Long, _
lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess
As Long, _
ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
' Ferme une application extérieure
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As
Long, _
ByVal uExitCode As Long) As Long
' Ferme l'application
Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetLastError Lib "kernel32" () As Long
'Constantes
Const STILL_ACTIVE = &H103
Const PROCESS_QUERY_INFORMATION = &H400
Sub S(ByVal Tache As String)
'Crée une tache puis regarde si elle est active
Dim hProcess As Long
Dim RetVal As Long
' récupère le handle (hProcess) du programme ouvert par Shell
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(Tache, 1))
' Regarde si il est actif
If (hProcess <= 0) Then
MsgBox "OpenProcess() a échoué : " & GetLastError()
Else
Do
' Retourne le status du processus en cours
GetExitCodeProcess hProcess, RetVal
'évite de faire travailler le système avec GetExitCodeProcess
DoEvents
Debug.Print RetVal; "/";
Sleep 100
Loop Until RetVal = STILL_ACTIVE
SendKeys "ok c'est bon", True
' si on veut attendre la fermeture du programme
' Do
' ' Retourne le status du processus en cours
' GetExitCodeProcess hProcess, RetVal
' 'évite de faire travailler le système avec GetExitCodeProcess
' DoEvents
' Debug.Print RetVal; "/";
' Sleep 10
' Loop While RetVal = STILL_ACTIVE
End If
'si on veut fermer le programme
If TerminateProcess(hProcess, 1) Then
MsgBox "TerminateProcess() a échoué " & GetLastError()
End If
CloseHandle (hProcess)
End Sub
Private Sub test()
S ("c:WINDOWSnotepad.exe")
End Sub
--
Amicalement.
Pascal
"il n'y a pas de vent favorable pour celui qui ne sait pas ou il va."
Sénèque.
http://www.ilyapa.net/excel
http://www.ilyapa.net/baseExcel
"Lolote" <nospam-yvan.treuvey@cned.fr> a écrit dans le message de news:
u4gQkaDWEHA.3024@TK2MSFTNGP09.phx.gbl...
Bonjour à tous,
Je dois faire appel à 2 applications (64 Ko pour la première et 3,5 Mo
pour
la deuxième).
Le problème est que losque je fait appel à la première application,
celle-ci
s'ouvre très rapidement et mes commandes SendKeys fonctionnent très bien.
Par contre, en ce qui concerne la deuxième application, celle-ci met un
certain temps à s'ouvrir et mes SendKeys sont souvent envoyés avant même
que
l'application soit réellement lancée ce qui me génère une erreur de
récupération de données.
Ma question est simple (peut être moins en ce qui concerne la
réalisation).
J'ai bien essayé de mettre une boucle d'attente, mais différents
utilisateurs doivent se sevrir de cette macro et tous les PC n'ont pas la
même vitesse d'exécution.
Bout de code :
Shell "C:FicheAdrePréparationCommande.exe",vbMaximizedFocus
Do
attente=attente + 1
Loop Until Attente > 5000
i=0
Do While Classe(i)<>"Fin"
SendKeys Classe(i),True
...
...
i=i+1
Loop
Comment savoir si l'application exécutée par la commande shell est
entièrement ouverte avcant de lancer les commandes SendKeys.
Salut, à tout hasard : Option Explicit Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, _ lpExitCode As Long) As Long Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _ ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long ' Ferme une application extérieure Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, _ ByVal uExitCode As Long) As Long ' Ferme l'application Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long) Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare Function GetLastError Lib "kernel32" () As Long
'Constantes Const STILL_ACTIVE = &H103 Const PROCESS_QUERY_INFORMATION = &H400 Sub S(ByVal Tache As String) 'Crée une tache puis regarde si elle est active Dim hProcess As Long Dim RetVal As Long ' récupère le handle (hProcess) du programme ouvert par Shell hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(Tache, 1)) ' Regarde si il est actif If (hProcess <= 0) Then MsgBox "OpenProcess() a échoué : " & GetLastError() Else Do ' Retourne le status du processus en cours GetExitCodeProcess hProcess, RetVal 'évite de faire travailler le système avec GetExitCodeProcess DoEvents Debug.Print RetVal; "/"; Sleep 100 Loop Until RetVal = STILL_ACTIVE SendKeys "ok c'est bon", True ' si on veut attendre la fermeture du programme ' Do ' ' Retourne le status du processus en cours ' GetExitCodeProcess hProcess, RetVal ' 'évite de faire travailler le système avec GetExitCodeProcess ' DoEvents ' Debug.Print RetVal; "/"; ' Sleep 10 ' Loop While RetVal = STILL_ACTIVE End If 'si on veut fermer le programme If TerminateProcess(hProcess, 1) Then MsgBox "TerminateProcess() a échoué " & GetLastError() End If CloseHandle (hProcess) End Sub
Private Sub test() S ("c:WINDOWSnotepad.exe") End Sub
-- Amicalement. Pascal "il n'y a pas de vent favorable pour celui qui ne sait pas ou il va." Sénèque. http://www.ilyapa.net/excel http://www.ilyapa.net/baseExcel "Lolote" a écrit dans le message de news:
Bonjour à tous,
Je dois faire appel à 2 applications (64 Ko pour la première et 3,5 Mo pour
la deuxième).
Le problème est que losque je fait appel à la première application, celle-ci
s'ouvre très rapidement et mes commandes SendKeys fonctionnent très bien.
Par contre, en ce qui concerne la deuxième application, celle-ci met un certain temps à s'ouvrir et mes SendKeys sont souvent envoyés avant même que
l'application soit réellement lancée ce qui me génère une erreur de récupération de données.
Ma question est simple (peut être moins en ce qui concerne la réalisation).
J'ai bien essayé de mettre une boucle d'attente, mais différents utilisateurs doivent se sevrir de cette macro et tous les PC n'ont pas la même vitesse d'exécution.
Bout de code :
Shell "C:FicheAdrePréparationCommande.exe",vbMaximizedFocus Do attente=attente + 1 Loop Until Attente > 5000 i=0 Do While Classe(i)<>"Fin" SendKeys Classe(i),True ... ... i=i+1 Loop
Comment savoir si l'application exécutée par la commande shell est entièrement ouverte avcant de lancer les commandes SendKeys.
@+Lolote
Géraudel Jean-Pierre
Bonjour, Je crois me souvenir que : 1° - la commande SendKeys est à éviter... (pour beaucoup de raisons : portabilité, etc.) 2° - il faut la mettre avant le Shell "Quelquechose" 3° - Voir également la commande DoEvents Donc, ds le code : SendKeys... Shell.... DoEvents... A tester... (peut-être permutter Shell et DoEvents) Jero
"Lolote" a écrit dans le message news:
Bonjour à tous,
Je dois faire appel à 2 applications (64 Ko pour la première et 3,5 Mo pour
la deuxième).
Le problème est que losque je fait appel à la première application, celle-ci
s'ouvre très rapidement et mes commandes SendKeys fonctionnent très bien.
Par contre, en ce qui concerne la deuxième application, celle-ci met un certain temps à s'ouvrir et mes SendKeys sont souvent envoyés avant même que
l'application soit réellement lancée ce qui me génère une erreur de récupération de données.
Ma question est simple (peut être moins en ce qui concerne la réalisation).
J'ai bien essayé de mettre une boucle d'attente, mais différents utilisateurs doivent se sevrir de cette macro et tous les PC n'ont pas la même vitesse d'exécution.
Bout de code :
Shell "C:FicheAdrePréparationCommande.exe",vbMaximizedFocus Do attente=attente + 1 Loop Until Attente > 5000 i=0 Do While Classe(i)<>"Fin" SendKeys Classe(i),True ... ... i=i+1 Loop
Comment savoir si l'application exécutée par la commande shell est entièrement ouverte avcant de lancer les commandes SendKeys.
@+Lolote
Bonjour,
Je crois me souvenir que :
1° - la commande SendKeys est à éviter... (pour beaucoup de raisons :
portabilité, etc.)
2° - il faut la mettre avant le Shell "Quelquechose"
3° - Voir également la commande DoEvents
Donc, ds le code :
SendKeys...
Shell....
DoEvents...
A tester... (peut-être permutter Shell et DoEvents)
Jero
"Lolote" <nospam-yvan.treuvey@cned.fr> a écrit dans le message news:
u4gQkaDWEHA.3024@TK2MSFTNGP09.phx.gbl...
Bonjour à tous,
Je dois faire appel à 2 applications (64 Ko pour la première et 3,5 Mo
pour
la deuxième).
Le problème est que losque je fait appel à la première application,
celle-ci
s'ouvre très rapidement et mes commandes SendKeys fonctionnent très bien.
Par contre, en ce qui concerne la deuxième application, celle-ci met un
certain temps à s'ouvrir et mes SendKeys sont souvent envoyés avant même
que
l'application soit réellement lancée ce qui me génère une erreur de
récupération de données.
Ma question est simple (peut être moins en ce qui concerne la
réalisation).
J'ai bien essayé de mettre une boucle d'attente, mais différents
utilisateurs doivent se sevrir de cette macro et tous les PC n'ont pas la
même vitesse d'exécution.
Bout de code :
Shell "C:FicheAdrePréparationCommande.exe",vbMaximizedFocus
Do
attente=attente + 1
Loop Until Attente > 5000
i=0
Do While Classe(i)<>"Fin"
SendKeys Classe(i),True
...
...
i=i+1
Loop
Comment savoir si l'application exécutée par la commande shell est
entièrement ouverte avcant de lancer les commandes SendKeys.
Bonjour, Je crois me souvenir que : 1° - la commande SendKeys est à éviter... (pour beaucoup de raisons : portabilité, etc.) 2° - il faut la mettre avant le Shell "Quelquechose" 3° - Voir également la commande DoEvents Donc, ds le code : SendKeys... Shell.... DoEvents... A tester... (peut-être permutter Shell et DoEvents) Jero
"Lolote" a écrit dans le message news:
Bonjour à tous,
Je dois faire appel à 2 applications (64 Ko pour la première et 3,5 Mo pour
la deuxième).
Le problème est que losque je fait appel à la première application, celle-ci
s'ouvre très rapidement et mes commandes SendKeys fonctionnent très bien.
Par contre, en ce qui concerne la deuxième application, celle-ci met un certain temps à s'ouvrir et mes SendKeys sont souvent envoyés avant même que
l'application soit réellement lancée ce qui me génère une erreur de récupération de données.
Ma question est simple (peut être moins en ce qui concerne la réalisation).
J'ai bien essayé de mettre une boucle d'attente, mais différents utilisateurs doivent se sevrir de cette macro et tous les PC n'ont pas la même vitesse d'exécution.
Bout de code :
Shell "C:FicheAdrePréparationCommande.exe",vbMaximizedFocus Do attente=attente + 1 Loop Until Attente > 5000 i=0 Do While Classe(i)<>"Fin" SendKeys Classe(i),True ... ... i=i+1 Loop
Comment savoir si l'application exécutée par la commande shell est entièrement ouverte avcant de lancer les commandes SendKeys.