Assurez-vous que le path relatif est utilisé dans cmd.exe lorsque vous exécutez des files par lots à partir d'Excel

J'ai un file Excel avec un button qui appelle une command Shell dans VB:

Shell(ThisWorkbook.Path & "\python_script.bat", vbNormalFocus) 

La command Shell appelle le file batch ci-dessus qui exécute un script Python:

 python python_script.py 

Tous les files pertinents (le file Excel, le file batch, les files de données, le file Python) sont tous situés dans le même directory, appelez ce programme sample_program , car je développe cela pour quelqu'un d'autre et j'ai l'intention de le décompresser et exécutez-le.

Dans Excel, lors du test de cette opération, je clique sur le button, puis j'ajoute cette erreur:

 C:\Users\<user_name>\Documents>python python_script.py python: can't open file 'python_script.py': [Errno 2] No such file or directory 

Pour une raison quelconque, bien que tous ces files se trouvent au même endroit, le cmd.exe s'exécute à partir de mon directory user: C:\Users\<user_name>\Documents

Je ne veux pas que cmd.exe utilise ce path; Je veux qu'il utilise le directory path\to\sample_program .

Comment puis-je utiliser cette méthode pour utiliser des paths relatifs, alors lorsque je transfère ce dossier à quelqu'un d'autre et que l'on place n'importe où, ça fonctionnera comme une unité autonome?

Essayez ceci, si path\to\sample_program est sur le même lecteur que votre lecteur de maison

 Shell "cmd.exe /k cd " & ThisWorkbook.Path & "&&python_script.bat" 

ou ceci si path\to\sample_program n'est pas sur le même lecteur que votre lecteur de maison, ou vous ne le savez pas à l'avance

 Shell "cmd.exe /k " & Left(ThisWorkbook.Path, 2) & "&&cd " & ThisWorkbook.Path & "&&python_script.bat" 

Vous pouvez utiliser Environ("username") pour get le nom d'ouverture de session user, donc pour votre exemple (ce que je présume est Windows 7)

 Sub GetDir() MsgBox "C:\Users\" & Environ("username") & "\Documents" End Sub 

Vous pouvez également récupérer automatiquement certains locations indépendamment du operating system à l'aide de SpecialFolders, c'est-à-dire

 Sub GetPath() Set wshShell = CreateObject("WScript.Shell") Documents = wshShell.SpecialFolders("MyDocuments") MsgBox Documents End Sub