VBA : lancer une ligne de commande

Bonjour,

Afin de convertir un PNG en GIF dynamiquement afin de pouvoir l'utiliser dans un UserForm, j'ai trouvé un ".exe" qui permet de faire la conversion.

Sauf que pour fonctionner, celui-ci à besoin que l'on glisse/dépose le PNG à convertir directement sur le ".exe"

Via la console cmd, si je saisi le chemin de l'exe -> (espace) -> chemin du PNG, cela fonctionne.
Aussi, j'aimerai pouvoir exécuter cette ligne de commande en VBA automatiquement. (Et fermer la fenêtre cmd une fois fini).

J'ai trouvé sur le net la fonction Shell. J'arrive à exécuter le cmd, mais il me faut saisir la ligne de commande manuellement.

Je ne comprend pas comment renseigner les arguments de la fonction shell pour ça.

Quelqu'un peut m'aider ?

En vous remerciant

11 réponses

  1. Merci beaucoup. J'ai regardé et essayé mais cela ne fonctionne toujours pas.

    Voici le code que j'ai saisi :
    Sub test()
        
        Dim appli As String
        Dim fichier As String
        
        appli = "C:\apng2gif.exe"
        fichier = DOSSIER_LOGOS & "toto.png"
        'DOSSIER_LOGOS est une fonction qui retourne
        'le chemin du dossier (en String), ce chemin
        'contient des espaces
        
        Shell "C:\WINDOWS\system32\cmd.exe " & appli & " " & """ & fichier & """, vbMinimizedNoFocus
    End Sub
    0
    1. Bonjour,

      cela ne fonctionne toujours pas
      Veux rien dire, que se passe-t-il ou pas. Un message d'erreur?
      Mettez un point d'arret sur la ligne Shell
      Lancez le code, passez le curseur souris sur DOSSIER_LOGOS pour voir le contenu
      Manque peut-être un \ devant Toto.png

      A voir:
      Manquerait deux " devant "C: et un apres fichier

      exemple:
      Shell """C:\Program Files (x86)\Nuance\PDF Professional 8\bin\GaaihoDoc.exe"" """ & path1 & """", vbNormalFocus
      0
  2. La console se lance, mais, elle est vide. Elle affiche juste un positionnement sur le dossier document et c'est tout.

    J'ai essayé de placer les doubles quotes exactement comme dans votre exemple, mais cela réagit exactement de la même façon.

    La fonction DOSSIER_LOGOS renvoi le chemin avec un \ à la fin.

    Je comprends pas ce qui cloche.
    0
    1. Bonjour,

      DOSSIER_LOGOS

      Ca sort d'ou cette chose ?

      Passez le curseur souris sur fichier
      0
  3. Comme je l'avait dit, cette fonction retourne un String qui est le chemin d'un dossier.
    Cette fonction retourne :
    Function DOSSIER_LOGOS() as String
    DOSSIER_LOGOS = ThisWorkbook.Path & "\Images\Logos\"
    End Function


    Quand je passe la souris en mode déboggage, elle me retourne bien ceci. D'ailleurs, j'ai également testé de mettre une
    MsgBox DOSSIER_LOGOS
    dans une procédure test, et elle me m'affiche le chemin correctement.

    Donc je suis sûr que le problème ne vient pas de là. Les dossiers "Images" et "Logos" sont écris sans faute (via copier/coller pour être sûr)
    0
    1. Bonjour a vous deux,

      Je lance l'appli avec une commande shell simple et ca marche. Par contre la fenetre de l'appli s'ouvre et dois faire click sur convertir
      Avec d'autre commandes dont celle du site donnee par cs_Le Pivert, ouverture fenetre appli aussi...
      0
      1. Merci beaucoup à tous les deux ! La méthode fournie par cs_Le Pivert, fonctionne. Et pour moi, je ne suis pas obligé de cliquer dans la console. Nickel ! J'ai fait le test en tapant la commande en dur. Reste plus qu'à la générer avec des variables et ça sera bon.

        Public Sub prcStartMSConfig64Cmd()
         Const WND_HIDE As Integer = 0
         Dim objWshShell As Object
         Set objWshShell = CreateObject("WScript.Shell")
         objWshShell.Run "%windir%\Sysnative\cmd.exe " & _
             "/C start c:\apng2gif.exe c:\toto.png", WND_HIDE, True 'j'ai modifié uniquement cette ligne
         Set objWshShell = Nothing
        End Sub
        
        0
        1. Re,
          J'arrive a la meme chose avec ceci:

          Shell "cmd /c start " & appli & " " & fichier & """", vbMinimizedFocus
          0
        2. @f894009Les grands esprits se rencontrent. Je viens de tester également ceci, et cela fonctionne aussi pour moi. il semblerai que ce qui me manquait était le
          /c start
          . Je n'avais pas mis ça avant.
          0
        3. @sifusaladeRe,

          ce qui me manquait était le /c start

          Non, ca marche sans, j'ai essaye avec pour voir la difference ..
          0
        4. @f894009Pour moi ça ne fonctionnait pas sans. Je suis totalement largué. Je vais prendre quelques jours de repos et regarder ça à nouveau. Car là, je suis totalement à l'ouest. Je ne comprend pas. Mais c'est sûr que je suis passé à côté de quelque chose.

          Surtout que même en remettant le
          /c start
          , après avoir ressayé sans, cela ne fonctionnait plus, cela m'ouvrai directement le PNG. Donc c'est sûr que j'ai merdé quelque part, j'ai le cerveau qui n'arrivent plus à suivre là ????.. Je fais n'importe quoi.

          Merci beaucoup en tout cas pour cette aide et le temps passé ????
          0
        5. @sifusaladeBonjour,
          essayez en écrivant les valeurs appli et fichier dans la ligne de commande, avec start pour vous. Ca ne fera qu'une chaine simple entre cote
          0
      2. merci.
        (PS : mes smiley ont été remplacés par des ??? du coup ça change le sens de la phrase lol)
        Je vais faire une pause sur le VBA quelques jours. Et je reviendrai préciser mon (ou mes erreurs). Cela pourra être utile à d'autres ^_^
        0
        1. Bonjour,

          Même après repos, je plane toujours autant. J'ai réalisé que le problème viens des doubles quotes.

          Sub Test(Str_Fichier as String)
          'Str_Fichier contient le chemin complet vers un fichier
              
              Dim appli As String
              Dim Fichier As String
              Dim commande As String
          
              appli = DOSSIER_LOGOS & "apng2gif.exe"
              Fichier = DOSSIER_LOGOS & Str_NomFichier
          
              commande = "cmd /C start " & appli & " " & Fichier
              
              Shell commande, vbMinimizedNoFocus
          End Sub
          


          lors de mes derniers tests, cela fonctionnait car pour la variable appli j'avais
          appli = "C:\apng2gif.exe"
          (un chemin sans espace).
          Hors maintenant que je l'ai remplacé. Cela ne fonctionne plus.

          La fonction DOSSIER_LOGOS renvoi un chemin qui contient des espaces.
          (D:\99 - Système\Utilisateurs\Moi\Bureau\Dossier Appli\Images\Logos\)

          Et le problème vient de là.

          Je n'ai toujours pas compris comment placer mes doubles quotes.

          En l'état, j'obtient un message d'erreur me disant que Windows ne trouve pas D:\99
          0
          1. Bonjour,
            Sorti du sable!

            Y a un truc, pourquoi D:, c'est plus C:?
            dans votre code ajoutez cette ligne
            apres commande=
            Debug.print commande


            mettez un point d'arret ligne Shell

            Lancez le code
            Faite afficher la fenetre d'execution pour voir le contenu de commande
            0
        2. En fait j'avais mis C: pour tester, mais le chemin de Appli, devra suivre le dossier qui contient le fichier Excel.
          Donc potentiellement D: et des chemins avec espaces. J'ai voulu tester comment ça réagirai.

          Je pensais qu'il me suffirai de changer le contenu de ma variable Appli une fois trouvé la bonne commande. Mais j'avais tout faux.

          J'ai fait pleins de tests dont debug.print.

          avec
          commande = "cmd /c start " & """" & appli & """" & " " & """" & Fichier & """"
          Debug.Print commande
          

          Debug.Print me donne :
          cmd /c start "D:\99 - Système\Utilisateurs\Moi\Bureau\Dossier Appli\Images\Logos\apng2gif.exe" "D:\99 - Système\Utilisateurs\Moi\Bureau\Dossier Appli\Images\Logos\58.png"


          et
          Shell commande, vbMinimizedNoFocus

          J'ai des doubles quotes qui entourent mes chemins, mais par contre ça m'ouvre directement le fichier 58.png. Hors moi, je veux lancer ce fichier 58.png avec l'appli apng2gif.exe (Appli)

          PS : mon bureau, ne se trouve pas sur C:, mais sur D:
          0
          1. Re,
            Bizard.

            Avant Appli=, mettez cette ligne
            Chdir DOSSIER_LOGOS
            Changer les affectation appli et fichier sans DOSSIER_LOGOS
            pour vous positionner sur le repertoire de vos fichiers
            0
        3. MERCI BEAUCOUP !!!!! Cela fonctionne.

          En fait à peine une minute avant de voir cette superbe réponse. Je me disait que c'était pas possible et j'avais résolu le truc en faisant une copie de "apng2gif.exe" dans "C:\TEMP\". Cela me permettait d'avoir un chemin sans espace pour Appli. Et ça m'obligeait à supprimer "C:\TEMP\apng2gif.exe" dans Workbook_BeforeClose.

          Mais là, c'est beaucoup mieux. C'est vraiment ce que je voulais faire à la base.

          Je ne suis pas du genre à demander de l'aide pour que les gens fassent le truc à ma place. Je cherche également à comprendre et apprendre.

          Si je comprends bien, la ligne Chdir DOSSIER_LOGOS me positionne dans ce dossier dans la console c'est ça ? Et donc si c'est ça, et si je comprends bien, en étant positionné dedans, plus besoin de chemin absolu.
          0
          1. Bonjour,
            Bowie David.
            0