programme externe

jackyr

XLDnaute Nouveau
Bonjour

je cherche a lancer un programme externe (un programme dos) et attendre qu'il soit termine (entre autre pour affichier le temps qu'il a mis)

j'ai utilisé cette ligne qui marche correctement mais on me donne la main immediatement alors qu'il tourne encore
Call Shell(ligne_commande, vbNormalFocus)

avez vous une solution? (pour votre info je fais de l'encodage video et utilise ffmpeg.exe qui ne fonctionne que sous dos)

merci
 

vbacrumble

XLDnaute Accro
Re : programme externe

Bonjour



Pourquoi passer par Excel ?


Passes par VBScript plutôt non ?

Exemple de script VBSCript pilotant ffmpeg.exe
Code:
'|------------------debut script----------
Set objS = WScript.Arguments
i = 0
For Each objIN in objS
objINext=Right(objIN,3)
If objINext = "wma" Then
objINCount=len(objIN)
objINCount=objINCount-3
objOUT=Left(objIN,objINCount)&"mp3"
objExec="ffmpeg.exe -i "&chr(34)&objIN&chr(34)&" -acodec libmp3lame -ab 160k -ac 2 -ar 44100 "&chr(34)&objOUT&chr(34)
Set objShell = CreateObject("WScript.Shell")
objShell.Run(objExec), 1, true
End If
i = i + 1
Next
WScript.Echo "TERMINE"
'----------------Fin script --> copier coller dans notepad et enregistrer sous wma2mp3.vbs //-hm2k-//
 
Dernière édition:

jackyr

XLDnaute Nouveau
Re : programme externe

merci beaucoup
ca ca marche mais je prends la main immediatement apres le lancement
c'est a dire que si j'ai 10 fichiers , je vais avoir 10 programmes en parrallele (ce qui est bien deja) mais il sera difficile de savoir combien de temps mettent chacuns des programmes , quel sera le resultat de chacun d'eux en terme de debit reel qu'ils trouvent et de plus on peut difficilement savoir si il y a eut des erreurs
il faudrait tester toutes les fenetres dos ouvertes MAIS lorsque le programme s'arrete il ferme sa fenetre donc plus de possibilite de chercher

merci beaucoup de cette reponse deja qui va me permettre d'ecrire le programme final apres le debug avec excel

bonne fin d'apres midi

jacky
 

vbacrumble

XLDnaute Accro
Re : programme externe

Re

Ce n'était qu'un exemple

A toi de pousser les investigations plus loin avec vbscript (ou vba)

Merci de revenir nous faire partager tes trouvailles ici.

(Cela intéressera certainement d'autres membres du forum)

edition: bonjour BrunoM45
 
Dernière édition:
C

Compte Supprimé 979

Guest
Re : programme externe

Bonjour Jackyr, salut vbacrumble

Pour attendre la fin d'exécution d'un appli, tu peux essayer d'utiliser le code suivant
Code:
Option Explicit
' Déclararer les API nécessaires
Public Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpExitCode As Long) As Long
Public Declare Function ShellExecuteEx Lib "shell32.dll" (ByRef lpExecInfo As SHELLEXECUTEINFOA) As Long
Public Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
' Déclarer les constantes
Public Const SEE_MASK_DOENVSUBST As Long = &H200
Public Const SEE_MASK_IDLIST As Long = &H4
Public Const SEE_MASK_NOCLOSEPROCESS As Long = &H40
Public Const SW_HIDE As Long = 0
Public Const SW_SHOW As Long = 5
Public Const WAIT_TIMEOUT As Long = 258&
Public Type SHELLEXECUTEINFOA
    cbSize As Long
    fMask As Long
    hwnd As Long
    lpVerb As String
    lpFile As String
    lpParameters As String
    lpDirectory As String
    nShow As Long
    hInstApp As Long
    lpIDList As Long
    lpClass As String
    hkeyClass As Long
    dwHotKey As Long
    hIcon As Long
    hProcess As Long
End Type
Public Function ExecCmd(ByRef vsCmdLine As String, Optional ByRef vsParameters As String, Optional ByRef vsCurrentDirectory As String = vbNullString, Optional ByVal vnShowCmd As Long = SW_SHOW, Optional ByVal vnTimeOut As Long = 200) As Long
Dim lpShellExInfo As SHELLEXECUTEINFOA
    With lpShellExInfo
        .cbSize = Len(lpShellExInfo)
        .lpDirectory = vsCurrentDirectory
        .lpVerb = "open"
        .lpFile = vsCmdLine
        .lpParameters = vsParameters
        .nShow = vnShowCmd
        .fMask = SEE_MASK_DOENVSUBST Or SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_IDLIST
    End With
    If ShellExecuteEx(lpShellExInfo) Then
        Do While WaitForSingleObject(lpShellExInfo.hProcess, vnTimeOut) = WAIT_TIMEOUT
            DoEvents
        Loop
        GetExitCodeProcess lpShellExInfo.hProcess, ExecCmd
        CloseHandle lpShellExInfo.hProcess
    Else
        ExecCmd = vbError
    End If
End Function
Sub test()
ExecCmd "Calc.exe"
MsgBox "Calculatrice fermée"
End Sub

A+
 

Membres actuellement en ligne

Statistiques des forums

Discussions
312 668
Messages
2 090 739
Membres
104 644
dernier inscrit
MOLOKO67