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 :

Exécution d'un batch dans une macro


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Par défaut Exécution d'un batch dans une macro
    Bonjour,
    Dans une macro Excel je souhaite créer un fichier batch, le remplir puis l'exécuter.
    Je rentre donc le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'Pour creer le fichier .bat
    Set fileObject = CreateObject("Scripting.FileSystemObject")
    Set file = fileObject.CreateTextFile("C:\essai.bat")
    'Pour écrire dans le fichier .bat
    With file
    .writeLine "ligne1"
    .writeLine "etc..."
    End With
    'Exécution du .bat
    ret = Shell("cmd /c C:\essai.bat", vbNormalFocus)
    Le fichier est bien créé et bien rempli mais lors de l'exécution je vois apparaître l'invité de commande puis disparaître très rapidement (je ne vois aucune ligne défiler, j'ai mis une pause pour bien vérifier que le fichier n'est pas exécuté et en effet, il n'y a pas de pause).

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2003
    Messages
    434
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 434
    Par défaut
    Salut,

    Etrange ca fonctionne chez moi (j'ai fais un dir c:\ /s , pour bien avoir le temps de voir )
    [J'ai juste ajoute un file.Close - mais ca fonctionne sans]

    Et si tu lances le batch manuellement (apres la creation par le programme)
    que se passe t il?

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Par défaut
    Si je lance le batch manuellement, il n'y a pas de problèmes ça marche.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    De mémoire, je crois qu'il faut une option start /b ou quelque chose comme ça.
    Mais tu risques aussi d'avoir un problème de synchronisation : en effet le code VB continue à s'exécuter en même temps que le batch.
    C'est un gros inconvénient de shell. Je vais essayer de retrouver mes notes là-dessus.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Alors pour un éventuel problème de synchronisation entre le code VB et le batch, il faudrait utiliser ce genre de code :

    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
    80
    81
    82
    83
    84
    85
    86
     
    Option Explicit
     
    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
     
    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 Const NORMAL_PRIORITY_CLASS = &H20&
    Private Const INFINITE = -1&
     
    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
    '...end
     
     
    Public Sub ShellPatient(vCommand As String)
    Dim proc As PROCESS_INFORMATION
    Dim start As STARTUPINFO
    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
     
    ' un exemple
    Sub testShell()
     
    ShellPatient "cmd /c C:\essai.bat"
     
    End Sub
    Bon je sais que c'était pas le problème rencontré, mais je sens que ça va venir...

    Et pour la fenêtre batch qui se ferme vite, j'ai retrouvé un exemple où le batch lançait une commande externe (un .exe ou un java) et là il fallait, dans le batch, mettre au début de cette ligne start /b , mais si le batch fait seulement des commandes DOS je ne pense pas que ça puisse s'appliquer

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Par défaut
    Ouais j'ai aussi prévu le coup de la synchronisation pour après

    Mais le premier problème vient d'un tout petit truc je pense ... mais je vois vraiment pas...

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Tout ce que je peux dire, c'est qu'en utilisant le fameux ShellPatient dont je t'ai fait la pub un peu plus haut , je lance directement le batch sans passer par cmd, comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellPatient "c:\monbatch.bat"
    Le batch lance entre autres un exe qui normalement (si je le lançais manuellement) s'exécute sous la console DOS, eh bien celle-ci s'ouvre et je vois défiler l'affichage que renvoie l'exe.

  8. #8
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Par défaut
    En utilisant ton bout de code, j'ai une erreur de compilation sur DoCmd: variable non définie.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Cette ligne-là ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.Hourglass True (et False)
    A mon avis c'est juste une modification du pointeur de la souris, tu dois pouvoir t'en passer.

    Précision : normalement ce code est à mettre dans un module.

  10. #10
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Par défaut
    Le code compile bien mais, malheureusement mon batch n'est toujours pas exécuté.

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Très curieux, ça me laisse coi quoi.
    Tu pourrais nous montrer ton batch ?

  12. #12
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Par défaut
    Voici mon batch (lancé manuellement il s'exécute bien).

    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
    REM ******************************
    set user=#######
    set passwd=######
     
    REM *********************************************
    REM * les fichiers seront sur le disque suivant *
    REM *********************************************
    K:\#########
     
    for /F "tokens=1-4 delims=/ " %%i in ('date /t') do set yyyymmdd=%%k%%j%%i
    echo Date: %yyyymmdd%
     
     
    set CRCO=10.103.249.21
     
     
    get cftp
     
    :cftp
    ECHO open %CRCO% >  passFTP.txt
    ECHO %USER%   	   >> passFTP.txt
    ECHO %PASSWD%      >> passFTP.txt
    ECHO GET 'CXSIAB00.JDPSN000.JDCJAAS1(0)' CRCO.txt >> passFTP.txt
    ECHO close >> passFTP.txt
    ECHO quit >> passFTP.txt
    ftp -s:passFTP.txt
     
    del passFTP.txt
     
    ECHO.
    REM ECHO Hasta la vista baby !
     
    :end
    :

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Bon je n'ai pas de proposition.
    Désolé

  14. #14
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Par défaut
    C'est normal, je viens de localiser le problème en fait.

    Il bloque sur la destination...

    Si je lance le ShellPatient dans C: cela marche mais pas sur le réseau sur lequel je souhaite l'exécuter.

    Le comble c'est qu'il arrive à me créer le fichier au bon endroit, à bien me le remplir, mais il peut pas l'exécuter sur cette même adresse...

    Sachant que ce n'est plus trop un problème d'Excel ou de macro, je vais mettre le sujet en Résolu dans quelques temps en attendant un peu voir si vous avez des idées pour ce problème là.

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Est-ce que le batch ne pourrait pas être sur C: et faire ses traitements sur le réseau ?

  16. #16
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Par défaut
    Non malheureusement.

  17. #17
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 70
    Par défaut
    Finalement j'ai trouvé: 3 guillemets de chaque côté de l'adresse au lieu de 1...

    Résolu.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/04/2015, 00h38
  2. Exécuter un batch dans une application
    Par Ashura75013 dans le forum Langage
    Réponses: 2
    Dernier message: 22/09/2008, 17h06
  3. Exécuter une sub d'un module dans une macro
    Par pnoel-bi dans le forum Access
    Réponses: 3
    Dernier message: 03/03/2006, 10h39
  4. Comment insérer une macro excel dans une macro word?
    Par max2245 dans le forum VBA Word
    Réponses: 15
    Dernier message: 07/01/2006, 17h44
  5. pb dans une macro excel VB
    Par syl221 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/10/2005, 17h29

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