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 :

Problème Macro Shell


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 233
    Par défaut Problème Macro Shell
    Bonjour,
    J'utilise une macro qui lance un fichier .bat sur un serveur.
    Il marche très bien sur certaines machines mais pas sur la mienne équipé d'excel 2002 SP3 et sur celles de 2 collègues qui ont la version 2007.

    Voici le code mais je ne suis pas sûr que ça vienne de là...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Option Explicit
     Const sChemin = "H:\Création\z_systeme - pas supprimer" 'Où sont situés les .bat et .txt pour les mails
     
    Private Sub CommandButton1_Click()
        Dim sYourCommand, filename As String
        Dim test As Integer
     
        filename = sChemin & "\corpsTous.txt"
        Open filename For Output As #1    ' Ouvre le fichier en écriture
     
        Print #1, "Le fichier " & ThisWorkbook.Name & "du répertoire " & ThisWorkbook.Path & " a été validé par le Service Commercial. Pouvez vous mettre en oeuvre les moyens nécessaires à la création de ces produits dans vos services." 'Contenu du .txt
        Close #1
     
        ChDir sChemin 'Placement dossier contenant .bat pour appel cmd
     
        sYourCommand = "envoiMailTous.bat"
        test = Shell("cmd /k " & sYourCommand, 0) 'Appel commande, renvoi nombre aléatoire ?
        If test > 0 Then ' si executé
            MsgBox "Tous les services ont été prévenus de l'avancement de la validation."
        End If
     
    End Sub
    Comment faire pour exécuter le fichier? est-ce la bonne méthode? D'où vient le problème à votre avis?
    Merci d'avance pour votre aide

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Bonjour,

    Il faut faire attention avec la fonction Shell car elle n'est pas synchrone. Ceci signifie que la macro ne s'arrête pas sur l'instruction Shell en attendant que la commande se termine.

    La fonction Shell ne fait que lancer la commande et la macro continue son exécution, donc il se peut que l'instruction "Msgbox" s'exécute même si l'exécution du .bat n'est pas terminée.

    Le résultat est souvent aléatoire...

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 233
    Par défaut
    houlala...
    Et que faut-il faire pour une solution plus stable?
    Que me conseillez vous pour exécutez ce .bat??
    Merci d'avance pour vos infos

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    Je vois 2 solutions:

    1/ La plus simple:

    Je ne sais pas ce que vous avez dans votre .bat mais il faudrait créer un fichier bidon à la fin de la commande dont vous testez l'existence dans la macro après la commande Shell.

    Pour tester l'existence pendant l'exécution du .bat vous faites une boucle du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    While Dir("fichier_bidon.txt") = ""
          Application.Wait (un certain temps)
    End While
    Je sais que l'instruction Application.Wait existe dans Excel mais je ne l'ai jamais utilisée. J'ai toujours utilisé la fonction Sleep de l'API Windows.


    2/ Utilisez la procédure ExecCmd (à base de fonctions de l'API Windows, donc un peu complexe) du module fourni en PJ. Cette procédure est à peu près équivalente à Shell mais elle est synchrone (bloque la macro tant que la commande n'est pas terminée). Remplacez la ligne du Shell par l'appel suivant adapté à votre exemple:

    Remarques:
    1/ ExecCmd ne récupère pas de code retour d'exécution du .bat
    2/ Je ne sais pas ce que ça donne avec Excel 2007

    Commencez par la tester avec des .bat pas trop long en exécution.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 233
    Par défaut
    D'accord mais il n'y pas plus simple pour juste lancer mon .bat qui contient déjà les lignes de commande?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 128
    Par défaut
    En terme d'actions que vous devez faire, la solution la plus simple est la 2ème solution puisque la procédure ExecCmd est déjà écrite.

  7. #7
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Bonjour,
    J'avais récupéré un code pour avoir une fonction shell wait qui lancé le shell et attendais la fin de l'exécution avant de continuer la macro si cela convient dis le moi je chercherais le code

    Edit au final le code été facile a trouver a mettre en début de module

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    Option Explicit
     
    Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
             hHandle As Long, ByVal dwMilliseconds As Long) As Long
     
    Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
             lpApplicationName As Long, ByVal lpCommandLine As String, ByVal _
             lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
             ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
             ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
             lpStartupInfo As STARTUPINFO, lpProcessInformation As _
             PROCESS_INFORMATION) 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 Declare Function GetExitCodeProcess Lib "kernel32" _
        (ByVal hProcess As Long, _
        lpExitCode As Long) As Long
     
    Private Const NORMAL_PRIORITY_CLASS = &H20&
    Private Const INFINITE = -1&
     
    Private Type STARTUPINFO
         cb As Long
         lpReserved As String
         lpDesktop As String
         lpTitle As String
         dwX As Long
         dwY As Long
         dwXSize As Long
         dwYSize As Long
         dwXCountChars As Long
         dwYCountChars As Long
         dwFillAttribute As Long
         dwFlags As Long
         wShowWindow As Integer
         cbReserved2 As Integer
         lpReserved2 As Long
         hStdInput As Long
         hStdOutput As Long
         hStdError As Long
    End Type
     
    Private Type PROCESS_INFORMATION
             hProcess As Long
             hThread As Long
             dwProcessID As Long
             dwThreadID As Long
    End Type
    '...end
     
     
    Public Sub ShellPatient(vCommand As String)
    Dim start As STARTUPINFO
    Dim proc As PROCESS_INFORMATION
     
    Dim ReturnValue As Integer
     
    'DoCmd.Hourglass True
     
    ReturnValue = CreateProcessA(0&, vCommand, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
    Do
        ReturnValue = WaitForSingleObject(proc.hProcess, 0)
        DoEvents
        DoEvents
    Loop Until ReturnValue <> 258
     
    ReturnValue = CloseHandle(proc.hProcess)
     
    'DoCmd.Hourglass False
     
     
    End Sub
    Je l'utilise ainsi pour lancer mes .bat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellPatient  chem & "LancementCalcul.bat"

  8. #8
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 233
    Par défaut
    j'ai fait mes test en testant vos procédures mais ça ne marche toujours pas...
    Info en + qui doit avoir son importance...
    J'essai d'envoyer un mail avec .bat, il s'agit de blat qui s'appuie sur un fichier .txt qui est au même niveau.
    On dirait que mon le cmd se lance et s'arrête tout de suite après (même avec les procédures et même avec des pauses dans le cmd...)
    ça craind...
    Help..

  9. #9
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 233
    Par défaut
    Bon ben je crois que j'ai trouvé. C'était au niveau des guillemets... Il fallait les doublés.
    Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème commande shell compilation auto
    Par ludovic85 dans le forum C#
    Réponses: 1
    Dernier message: 07/02/2007, 12h28
  2. Problème commandes shell-trop d'arguments
    Par SuperCed dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 22/12/2006, 12h57
  3. Problème avec SHELL
    Par Jasgui dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 19/09/2006, 19h14
  4. [VBA-E] Problème macro excel
    Par pontus21 dans le forum Macros et VBA Excel
    Réponses: 32
    Dernier message: 19/05/2006, 18h38
  5. []Problème de SHELL
    Par laurentfrancis dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/10/2005, 19h41

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