Vba => Bat

Résolu/Fermé
zapp56 - 25 mars 2015 à 19:44
 zapp56 - 28 mars 2015 à 11:29
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
27 mars 2015 à 08:01
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
MERCI !!!!!

Un grand merci, c'est exactement ce que je cherchais. Ce code fonctionne parfaitement !
0
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 jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > zapp56
27 mars 2015 à 22:48
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
Ok ! encore merci pour ton aide !
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
25 mars 2015 à 21:59
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
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 26006 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 avril 2024 3 289
26 mars 2015 à 14:49
Salut,

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

MkDir "répertoire" 

0
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 26006 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 avril 2024 3 289 > zapp56
26 mars 2015 à 17:56
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
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 26006 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 avril 2024 3 289 > zapp56
26 mars 2015 à 18:31
C'est à toi de le gérer via une boucle...
0
Ok, je vais me rabattre sur le vb alors ;)

Merci.
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
26 mars 2015 à 18:35
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
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 lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
26 mars 2015 à 20:18
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
Ok, je testerai ça demain. Merci à tous.
0