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.
A voir également:

4 réponses

pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
zapp56
 
MERCI !!!!!

Un grand merci, c'est exactement ce que je cherchais. Ce code fonctionne parfaitement !
0
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761 > 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
zapp56
 
Ok ! encore merci pour ton aide !
0
gbinforme Messages postés 14946 Date d'inscription   Statut Contributeur Dernière intervention   4 724
 
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
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
blux Messages postés 27109 Date d'inscription   Statut Modérateur Dernière intervention   3 359
 
Salut,

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

MkDir "répertoire" 

0
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
blux Messages postés 27109 Date d'inscription   Statut Modérateur Dernière intervention   3 359 > 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
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
blux Messages postés 27109 Date d'inscription   Statut Modérateur Dernière intervention   3 359 > zapp56
 
C'est à toi de le gérer via une boucle...
0
zapp56
 
Ok, je vais me rabattre sur le vb alors ;)

Merci.
0
gbinforme Messages postés 14946 Date d'inscription   Statut Contributeur Dernière intervention   4 724
 
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
zapp56
 
Je viens de tester ton code. J'ai une erreur : séparateur de liste [...]
J'ai essayé sans :&REPERT&"
La même.
0
gbinforme Messages postés 14946 Date d'inscription   Statut Contributeur Dernière intervention   4 724
 
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
zapp56
 
Ok, je testerai ça demain. Merci à tous.
0