IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Lancer un prog extérieur en arrière-plan et avoir le statut en retour


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut Lancer un prog extérieur en arrière-plan et avoir le statut en retour
    Bonjour,

    Pour récupérer des données d'une API tierce, je suis obligé d'éxecuter un script PowerShell. Jusque-là, pas trop de problème sauf que je souhaite le lancer en mode réduit et avoir le retour de la fin du script.

    1. Executer mon script PowerShell via .RUN me permet de le lancer en arrière-plan (fenêtre minimisée et garde la fenêtre principale active) mais pas la fin du script (donc tempo obligatoire et 2s quand tu as beaucoup de lignes, c'est long) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set WsShell = CreateObject("WScript.Shell")
    WsShell.Run (strCommand), 7, True 'Displays the window as a minimized window. The active window remains active.
    Application.Wait (Now + TimeValue("00:00:02"))
    2. Executer mon script PowerShell via .Exec me permet de savoir que le script est terminé et donc de continuer sans attendre les 2s. Par contre, impossible de lancer la fenêtre PowerShell en arrière-plan :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set WsShell = CreateObject("WScript.Shell")
    Set oExec = WsShell.Exec(strCommand)
    Do While oExec.Status = 0
    Sleep 100
    Loop
    J'ai tenté de réduire la fenêtre après le lancement mais sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Const WM_SYSCOMMAND As Long = &H112
    Private Const SC_MINIMIZE As Long = &HF020 
    Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Declare Function PostMessageW Lib "user32.dll" (ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Public Declare Function ShowWindowAsync Lib "user32.dll" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
     
    SendMessage oExec.processID, WM_SYSCOMMAND, SC_MINIMIZE, 0
    ShowWindowAsync oExec.processID, SC_MINIMIZE
    PostMessageW oExec.processID, WM_SYSCOMMAND, SC_MINIMIZE, 0&
    D'avance merci pour vos idées !

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    305
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 305
    Par défaut application
    il faut lancer un application.run
    et application.visible = false pour la cacher
    ce qui n'empêche pas de la rappeler


    Option Explicit

    Public Declare Function EnumWindows Lib "User32" (ByVal lpEnumFunc As Long, _
    ByVal param As Long) As Long
    Public Declare Function GetWindowText Lib "User32" Alias "GetWindowTextA" _
    (ByVal hWnd As Long, _
    ByVal lpString As String, _
    ByVal cch As Long) As Long
    Public Declare Function IsWindowVisible Lib "User32" (ByVal hWnd As Long) As Long
    Public Const MAX_LEN = 260

    Public results As Dictionary
    Public criteria As String

    Public Sub Example()
    Dim fenetre as variant
    criteria = "win32"
    Set results = New Dictionary
    Call EnumWindows(AddressOf EnumWindowCallback, &H0)
    Dim result As Variant
    'fenetre = nom de la fenêtre
    For Each result In results.Keys
    if instr(result, fenetre) <> 0 then
    appactivate result
    result.visible= false
    End if
    Next result
    End Sub

    Public Function EnumWindowCallback(ByVal hWnd As Long, ByVal param As Long) As Long
    Dim retValue As Long
    Dim buffer As String
    If IsWindowVisible(hWnd) Then
    buffer = Space$(MAX_LEN)
    retValue = GetWindowText(hWnd, buffer, Len(buffer))
    If retValue Then

    If InStr(1, buffer, criteria, vbTextCompare) > 0 Then
    results.Add hWnd, Left$(buffer, retValue)
    End If
    End If
    End If
    EnumWindowCallback = 1
    End Function

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 540
    Par défaut
    Pitiée, pas les API pour un truc aussi simple.

    Le dernier parametre de la methode run indique s'il faut attendre la fin de la commande ou pas.

    Par contre quelle est ta commande ?
    Si cette dernière lance une appli tierce de facon asynchrone, la commande se termine alors que l'appli tierce continue à tourner.
    Dans ce cas, c'est l'application tierce qu'il faut lancer (et non le script qui la lance).

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    Bonjour,

    Effectivement, avec TRUE à la fin, la fonction .run attend bien la fin de l'exécution du script PowerShell pour continuer à dérouler le code.

    Le script sous PowerShell génère un fichier .txt pour le résultat et de de temps en temps, ce fichier .txt est vide donc je pensais que j'allais le consulter trop tôt. Si je relance le script une 2ème fois alors le fichier .txt est correct.

    Donc, il y a sûrement une erreur avec l'exécution du script donc j'ai choisi de gérer les erreurs pour la fonction .run :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set WsShell = CreateObject("WScript.Shell")
    Score = WsShell.Run ((strCommand), 7, True) 'Displays the window as a minimized window. The active window remains active.
    If Score <> 0 the Msgbox "PowerShell script error num : " & Score

    A suivre !

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 540
    Par défaut
    Citation Envoyé par 306xshdi Voir le message
    Le script sous PowerShell génère un fichier .txt pour le résultat et de de temps en temps, ce fichier .txt est vide donc je pensais que j'allais le consulter trop tôt. Si je relance le script une 2ème fois alors le fichier .txt est correct.

    Donc, il y a sûrement une erreur avec l'exécution du script donc j'ai choisi de gérer les erreurs pour la fonction .run :
    Oui c'est la bonne approche.

    Par contre ne confond pas erreur d'execution du script qui resulteras en un code de retour anormal et bug du script qui génère un comportement anormal mais un code retour Ok.

  6. #6
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Il est peut-être également possible de directement faire l'appel à ton API Tiers via VBA. On peut avoir des info sur l'API en question?

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. Lancer une fonction JAVA en arrière plan ou asynchrone ?
    Par Mr.Robot12 dans le forum Développement Web en Java
    Réponses: 5
    Dernier message: 24/01/2018, 17h14
  2. Réponses: 10
    Dernier message: 28/01/2014, 21h05
  3. [PHP-JS] Lancer un script PHP en arrière plan
    Par aroua dans le forum Langage
    Réponses: 4
    Dernier message: 29/08/2007, 13h40
  4. Lancer un PL/SQL en arrière plan.
    Par macben dans le forum PL/SQL
    Réponses: 1
    Dernier message: 30/03/2007, 10h25
  5. Réponses: 1
    Dernier message: 01/03/2006, 12h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo