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