Vba => Bat

Résolu
zapp56 -  
 zapp56 -
Bonjour,

Cela fait quelques heures que je cherche et je n'ai encore pas trouvé de réponse à cette question, que beaucoup ont déjà dû se poser...

J'ai une variable texte, dans une textbox, dans un userform Excel, qui contient le chemin d'accès d'un répertoire : "c:\Docs\Bdd"

Je souhaite que certains utilisateurs puissent paramétrer ce chemin. Un fichier batch s'occupe de toutes les formalités de création de dossiers.

Le fichier batch s'appelle "run.bat"

Ma macro va appeler le lancement du batch. Je voudrais qu'elle lui envoie également la la variable contenant le chemin d'accès pour avoir un batch auto-modulable.

Pourriez-vous m'aider s'il vous plaît ?

Cordialement.

4 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Le plus simple, le plus pratique pour créer un répertoire et tous ses sous-répertoires uniquement lorsque cela est nécessaire (s'il n'existe pas) :
    Private Declare Function SHCreateDirectoryEx Lib "shell32" Alias "SHCreateDirectoryExA" (ByVal hwnd As Long, ByVal pszPath As String, ByVal psa As Any) As Long
    
    Public Const monRep$ = "C:\Docs\Bdd\d1\d2\d3\"
    
    Sub Creation_Repertoire()
    'sources : UcFoutu :
        'http://www.developpez.net/forums/d613347/logiciels/microsoft-office/excel/macros-vba-excel/tester-repertoire-existe-creer-non/
        SHCreateDirectoryEx 0, monRep, ByVal 0&
    End Sub


    A adapter, bien sur. La constante monRep doit être une variable si tu désires la faire modifier par l'utilisateur.
    3
    1. zapp56
       
      MERCI !!!!!

      Un grand merci, c'est exactement ce que je cherchais. Ce code fonctionne parfaitement !
      0
    2. zapp56
       
      Par curiosité quand même... pourrais-tu m'expliquer la première ligne ? Je veux dire, comment fonctionne-t-elle, que sont ses arguments, que sont "hwnd", "pszPath", "psa"...
      Merci =)
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > zapp56
         
        Bonsoir,

        Absent pendant plusieurs jours, je prends juste 5 minutes pour te répondre.

        Sans entrer dans le détail, renseigne toi (si tu ne connais pas encore) sur ce que sont les API de windows.
        En gros, ce sont des fonctions mises à disposition de chacun par microsoft. Elles sont développées dans des fichiers dll.
        Ici, on va utiliser une des fonctions contenues dans le fichier shell32.dll. Fais une recherche sur ton ordi, il la possède.
        Cette fonction SHCreateDirectoryEx est là exactement pour servir à l'usage que tu en as aujourd'hui, la création lorsqu'il le faut, d'un répertoire.
        On la déclare, en VBA, en entête de module. (Cela n'est pas sans rappeler la déclaration des fonctions en langage C...)
        Une fois déclarée, en entête de module, tu peux à loisir t'en servir dans ton module, ou dans ton projet en globalité si tu l'as déclarée en Public.

        Plus d'infos notamment pour ses paramètres...
        A++
        0
    3. zapp56
       
      Ok ! encore merci pour ton aide !
      0
  2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    Bonjour,

    Quand tu lances ton batch, il suffit de rajouter le chemin du fichier :
    run.bat chemin
    et dans ton batch ce sera le premier paramètre %1
    0
    1. zapp56
       
      Merci de ta réponse, mais je n'ai pas compris :(
      Pour plus de clarté :
      "Run.bat" est mon fichier batch, dans le dossier "c:\Docs\"
      REPERT = "c:\Docs\Bdd\" (as string) (modifiable dans la textbox de l'usf)

      Quand j'appelle :
      shell("c:\Docs\Run.bat", AppWinStyle.NormalFocus)

      Je souhaiterais qu'il envoie à mon fichier "Run.bat" la variable REPERT.
      Ainsi, le batch contiendrait la ligne de commande :
      MD %REPERT%


      Suis-je plus clair ?
      0
  3. blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Salut,

    en VBA, on sait exécuter des commandes fichiers, pourquoi n'utilises-tu pas cette fonctionnalité ?

    MkDir "répertoire" 

    0
    1. zapp56
       
      Bonjour, blux, et merci de répondre.
      Le problème de "MkDir" est que le chemin d'accès ne peut pas contenir plus d'un seul dossier.
      Je sais qu'il y a une procédure pour créer certains dossiers, mais je ne l'ai pas comprise alors je me suis rabattu sur un batch.
      De plus, il est possible que mon batch me serve ultérieurement si j'arrive à lui envoyer une variable.

      Ou alors tu as une manière simple de créer des dossiers selon un path variable en vba, dans une procédure simple... Je rappelle que l'extraction du path est fait à partir d'une textbox sur usf.
      0
      1. blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   3 455 > zapp56
         
        Tout est possible (ou presque) via vba en ce qui concerne la gestion de fichiers...
        Qu'entends-tu par limite d'un seul dossier ?
        0
    2. zapp56
       
      Si je fais :
      MkDir ("c:\Docs\")

      ça va effectivement créer un dossier dans le répertoire c:
      Mais si je fais :
      Mkdir ("c:\Docs\Bdd")

      Cela ne créera pas un dossier "Docs" puis un dossier "Bdd".
      Ce que je veux c'est que le chemin d'accès puisse être totalement variable.

      Dans un batch, si je fais
      MD C:\Docs\Bdd\d1\d2\d3
      Cela créera tous les dossiers, sous-dossiers etc du chemin d'accès.
      0
      1. blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   3 455 > zapp56
         
        C'est à toi de le gérer via une boucle...
        0
    3. zapp56
       
      Ok, je vais me rabattre sur le vb alors ;)

      Merci.
      0
  4. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    Bonjour,

    Je voudrais qu'elle lui envoie également la variable contenant le chemin d'accès
    Avec
    shell("c:\Docs\Run.bat " & REPERT & ", AppWinStyle.NormalFocus)
    , tu envoies bien ton accès.

    Ensuite dans un batch, si tu fais
    MD %1
    , cela donnera
    MD C:\Docs\Bdd\d1\d2\d3 
    si REPERT avait comme valeur "C:\Docs\Bdd\d1\d2\d3" : ce que tu veux me semble-t-il ?
    0
    1. zapp56
       
      Je viens de tester ton code. J'ai une erreur : séparateur de liste [...]
      J'ai essayé sans :&REPERT&"
      La même.
      0
    2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
       
      c'est sûr que si tu mets cela ,&REPERT&, çà ne fonctionnera pas. il y avais un guillemet de trop :
      shell("c:\Docs\Run.bat " & REPERT & ,AppWinStyle.NormalFocus)
      et il faut l'espace.
      0
    3. zapp56
       
      Ok, je testerai ça demain. Merci à tous.
      0