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 :

PB Parametrage de ShellExecute


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Points : 33
    Points
    33
    Par défaut PB Parametrage de ShellExecute
    Bonjour a tous,

    Je cherche actuellement a lancer via VBA Excel une commande dans le shell cmd de WINDOWS.

    Pour cela, j 'applique le code suivant:
    Declaration de ShellExecute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

    Partie du code ou je fais appel a shellExecute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Result, CommandString, fName, fCommandString
    fName = "C:\WINDOWS\system32\cmd.exe" ''"Index.html"
    fCommandString = "pdsdecode -p ""D:\Files Exeample\GPIT-F_Calibration_Report.PDS"" -d ""D:\Files Exeample\GPIT-F_Calibration_Report.txt"""
    MsgBox (fCommandString)
    Result = ShellExecute(hwnd, "Open", fName, fCommandString, 0, 1)
    If Result = 0 Then MsgBox ("Error while executing command")
    J ai egalement essaye la chose suivante, histoire de tracer mon probleme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Result, CommandString, fName, fCommandString
    fName = "C:\WINDOWS\system32\cmd.exe" ''"Index.html"
    fCommandString = "cd .." ''"pdsdecode -p ""D:\Files Exeample\GPIT-F_Calibration_Report.PDS"" -d ""D:\Files Exeample\GPIT-F_Calibration_Report.txt"""
    MsgBox (fCommandString)
    Result = ShellExecute(hwnd, "Open", fName, fCommandString, 0, 1)
    If Result = 0 Then MsgBox ("Error while executing command")
    Dans les deux cas, je me retrouve avec la fenetre du shell "system32\cmd.exe" ou apparait D:\Documents\.
    Il semble donc que la fonction Shellexecute ne comprend pas mon parametrage fCommandString .

    Quelqu'un a t'il une explication?

    Merci de votre aide

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    C'est normal, là tu lances cmd, donc tu passes en dos.
    Si tu veux ouvrir un fichier texte, teste ça sans rien changer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute 0, vbNullString, "D:\Files Exeample\GPIT-F_Calibration_Report.txt", vbNullString, vbNullString, 0
    Tu dis ce qui ne va pas
    A+

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Si tu veux ouvrir un fichier texte, teste ça sans rien changer
    Je ne cherche pas a ouvrir un fichier texte.
    Je cherche a faire executer dans cmd.exe la commande fCommandString, qui est passée en parametre dans le ShellExecute. J y arrive sans probleme dans une MFC mais pas sous VBA.

    Le commande ShellExecute marche tres bien quand je cherche a "seulement"" ouvirir un fichier texte".

    Edit @ 14h21
    Je viens de realiser quew sous MFc j utilise non pas ShellExecute mais ShellExecuteEx avec la fonction WaitforSingleObject pour etre sur que mon app attende la fin.
    Il me faut donc trouver comment incorpporer tout cela en VBA!!

    Edit @ 14h36
    J ai exactement le meme probleme avec ShellExecuteEX!
    Des idees?

    Declaration
    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
    Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    Private Declare Function ShellExecuteEX Lib "shell32.dll" Alias "ShellExecuteEx" (SEI As SHELLEXECUTEINFO) As Long
    Private Declare Function WaitForSingleObject Lib "Kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Private Declare Function CloseHandle Lib "Kernel32" (ByVal hObject As Long) As Long
    Private Const WAIT_INFINITE = -1&
    Private Type SHELLEXECUTEINFO
        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
    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
    Dim Result, CommandString, fName, fCommandString
    fName = "D:\Files Exeample\GPIT-F_Calibration_Report.txt" ''"C:\WINDOWS\system32\cmd.exe" ''"Index.html"
    fCommandString = "pdsdecode -p ""D:\Files Exeample\GPIT-F_Calibration_Report.PDS"" -d ""D:\Files Exeample\GPIT-F_Calibration_Report.txt"""
    ''MsgBox (fCommandString)
    ''Result = ShellExecute(hwnd, "Open", fName, fCommandString, 0, 0)
    ''Result = ShellExecute(hwnd, 0, fName, fCommandString, 0, 0)
    ''ShellExecute 0, vbNullString, "D:\Files Exeample\GPIT-F_Calibration_Report.txt", vbNullString, vbNullString, 0
     
    Dim ExecuteEncodeInfo As SHELLEXECUTEINFO
    With ExecuteEncodeInfo
        ExecuteEncodeInfo.cbSize = Len(ExecuteEncodeInfo) 'sizeof(ExecuteEncodeInfo)
        ExecuteEncodeInfo.fMask = 0
        ExecuteEncodeInfo.hwnd = 0
        ExecuteEncodeInfo.lpVerb = "Open"
        ExecuteEncodeInfo.lpFile = "C:\WINDOWS\system32\cmd.exe"
        ExecuteEncodeInfo.lpParameters = fCommandString
        ExecuteEncodeInfo.lpDirectory = 0
        ExecuteEncodeInfo.nShow = 1
        ExecuteEncodeInfo.hInstApp = 0
    End With
    If Result = ShellExecuteEX(ExecuteEncodeInfo) = False Then MsgBox ("Error while executing command") _
    Else Call WaitForSingleObject(ExecuteEncodeInfo.hProcess, WAIT_INFINITE)
    Je viens d essayer ton code ci-dessus tel quel.
    il ne se passe rien du tout.

  4. #4
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Salut,

    je ne sais pas si cela peut convenir pour ton cas, mais j'ai ci-dessous un exemple ou je lance un proc avec des parametres. Ca me parait similaire.

    le but est de boucle sur un répertoire et pour chaque fichier .ETI trouvé, on lance le soft an passant le nom du fichier .ETI en parm.

    Voici le code (il marche) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Proc = "C:\Program Files\Weber Marking Systems\Legi for Windows\bin\Legi32.exe"
    Quote = ""
    Scan = Trim(Labels_folder) & "\*.ETI"
    'obtient le premier fichier .ETI qui est dans Labels_Folder
    Rep = Dir(Scan)
     
    Do While (Rep <> "")
    cmd = Quote & Proc & Quote & " /batch " & Quote & Labels_folder & "\" & Rep & Quote
    ret = Shell(cmd, vbNormalFocus)
        'passe à l'élément suivant
        Rep = Dir
    Loop
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Ok. ShellExecute s'adresse à un fichier windows, pas Dos
    ShellExecute recherche l'application indiquée par défaut dans windows pour ouvrir un fichier avec extension connue par "lui".
    Pour utiliser cmd, c'est Shell tout court.
    Voici toujours un exemple avec une commande dos
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shell "cmd /c dir *.* /s > d:\doc\txt.txt"
    liste le répertoire et les sous-rpertoires dans le fichier txt.txt
    Adapté à ton code, je ne sais pas mais la ligne doit toujours commencer par "cmd"
    Tu vois si tu peux adapter... Ou alors détaille-nous les paramètres que tu utiises pour qu'on puisse savoir qu'en faire
    A+

    Ici une explication sur shellexecute.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shell "cmd /c dir *.* /s > d:\doc\txt.txt"
    Il ne se passe rien du tout apres cette commande (pas de creation de fichier "d:\doc\txt.txt"). Je l'ai pourtant copie tel quel.
    J'utilise Excel2003, si ca peut t'aiguiller.
    Edit@11:48: Pardon, cette commande fonctionne bien. Il faut par contre que le dossier D:\doc soit au prealablement cree

    Concernant ShellExecute et son pendant ShellExecuteEX, ce sont bien les fonctions que j'utilise sous MFc pour lancer ce genre de commande, a savoir.
    1 - Lancer la fenetre cmd.exe
    2 - Y passer en commande ma string (lpzParameters) "pdsdecode -p nomFichier.PDS -d nomFichier.txt" (c est une commande maion permettant de decoder un fichier PDS en fichier ASCII)
    3 - Attendre que la commande se soit bien executée (grace a la fonction WaitForSingleObject)

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    As-tu testé la solution de Godzestla ?

    Sinon, j'utilise également cette syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Shell "cmd /c " & Chemin & "Util.exe " & CheminFichier & "xlsAppli.vbs"
    où j'indique le chemin de l'exe et du fichier.
    Désolé mais je suis brouillé avec tes paramètres

  8. #8
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Normallement ma solution devrait fonctionner.

    Seule inconnue, au niveau des quotes je ne sais pas s'il faut "quotter" séparément les paramètres ou globalement et ou exactement les mettres par rapport à certains switchs (-p , -d).

    personnelkement j'essaierai ceci, en remplacant full_pathname par ce qu'il y a lieu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Proc = "full_pathname\pdsdecode"
    parm1 = "D:\Files Exeample\GPIT-F_Calibration_Report.PDS"
    parm2 = "D:\Files Exeample\GPIT-F_Calibration_Report.txt"
    Quote = ""
    
    
    cmd = Quote & Proc & Quote & " -p " & Quote & parm1 & Quote & " -d " & Quote & parm2 & Quote
    ret = Shell(cmd, vbNormalFocus)
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Merci beaucoup.
    La solution de Godzestla marche tres bien.
    Il ne me reste plus qu a trouver la fonction permettant d attendre le temps necessaire a la creation de mon fichier (output de cmd).

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Bravo !
    Pour le délai, DoEvents règle généralement le pb en VBA (laisse le temps au système de travailler) S'écrit simplement
    sur la ligne suivant la commande
    Sinon, tu as Wait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Application.Wait(Now + TimeValue("0:00:02"))
    Pour 2 secondes (!)

  11. #11
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Tant mieux si cela fonctionne.

    Tu as essayé pour l'attente. ?
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Points : 33
    Points
    33
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Application.Wait(Now + TimeValue("0:00:02"))
    Ce code marche du feu de Dieu.
    Un grand merci a tous les deux!

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

Discussions similaires

  1. [TOMCAT] parametrage du fichier web.xml
    Par sebos63 dans le forum Tomcat et TomEE
    Réponses: 12
    Dernier message: 06/05/2010, 12h09
  2. test de l'exectuion d'un bat par Shellexecute
    Par Argonz dans le forum C++Builder
    Réponses: 8
    Dernier message: 10/12/2003, 08h18
  3. Ouvrir le poste de travail (avec ShellExecute) ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 17/08/2003, 11h09
  4. Réponses: 2
    Dernier message: 18/11/2002, 09h12
  5. Parametrage des options de projet
    Par ares7 dans le forum EDI
    Réponses: 7
    Dernier message: 22/07/2002, 15h33

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