2016-09-06 36 views
3

我需要從vba中調用python腳本,它可以通過使用shell來正常工作。用wsh調用vba的python腳本

Sub CallPythonScript() 

     Call Shell("C:\Program Files (x86)\Python27\python.exe C:\Users\Markus\BrowseDirectory.py") 

End Sub 

但是,當我嘗試使用wsh(因爲等待funcionality)它只是不會工作了。

Sub CallPythonScript() 

    Dim wsh As Object 
     Set wsh = VBA.CreateObject("WScript.Shell") 

    Dim myApp As String: myApp = "C:\Program Files (x86)\Python27\python.exe C:\Users\Markus\BrowseDirectory.py" 
    Dim waitOnReturn As Boolean: waitOnReturn = True 
    Dim windowStyle As Integer: windowStyle = 1 

    wsh.Run """"" & myApp & """"", windowStyle, waitOnReturn 

End Sub 

但是,我在家中使用了相同的代碼,並且一切正常,只是路徑中沒有任何空白。所以自然而然地,這些空白肯定會出現問題。非常感謝幫助。

+0

我懷疑它曾用過那條路:你的路徑中有空格。 wsh.Run如何知道如何解析參數?在家裏,你肯定有'C:\ python27'中的python。 –

+0

準確地說,這就是我的意思是「路徑中沒有任何空白」。 –

回答

1

您是否驗證過該路徑將您直接帶到解釋器?

試試這個,

Dim myApp As String: myApp = "C:\""Program Files (x86)""\Python27\python.exe C:\Users\Markus\BrowseDirectory.py" 
+0

是的,路徑本身是正確的。問題在於路徑中的空間。可悲的是你的解決方案對我來說並不合適。 –

+0

嗯它應該。這裏有另外一種方法,''C:\「&chr(34)&」Program Files(x86)「&chr(34)&」\ Python27 \ python.exe C:\ Users \ Markus \ BrowseDirectory.py「 '這是否工作? –

+0

另外,'wsh.Run myApp,windowStyle,waitOnReturn'就足夠了我的改變 –

2

的解釋不可能區分含實際參數空間,除非你用引號保護目錄的目錄。

解決方法實際上是一種更好的解決方案,它依賴於Python將.py擴展名與安裝的Python解釋器相關聯的事實。

只是這樣做(像你將推出一個.bat文件):

Dim myApp As String: myApp = "C:\Users\Markus\BrowseDirectory.py" 

,你的代碼將工作無論Python安裝(與空間問題消失)

這個小測試在Excel工作對我來說,跑pycrust.py這恰好是在我的系統PATH

Sub foo() 
    Dim wsh As Object 
    Set wsh = VBA.CreateObject("WScript.Shell") 

    Dim myApp As String: myApp = "pycrust.py" 
    Dim waitOnReturn As Boolean: waitOnReturn = True 
    Dim windowStyle As Integer: windowStyle = 1 

    wsh.Run myApp, windowStyle, waitOnReturn 

End Sub 

(我不得不對mplify您的wsh.Run線,因爲它不工作,我懷疑您添加的256個引號沒有任何好處)

+0

謝謝你的回答。可悲的是,這兩個版本都不適合我。使用第一種方法我得到error429 ActiveX組件不能創建對象。第二種方法導致對象iwshshell3的錯誤方法運行失敗。 –

0

我的腳本在我的工作表和Python(但我把表和py腳本放在同一個文件夾):

Path = ActiveWorkbook.Path 
Pth = """" & Path & "\pythonscript_name.py" & """" 
Ph = """" & "C:\Python27\python.exe " & Pth & """" 

Dim wsh As Object 
Set wsh = VBA.CreateObject("WScript.Shell") 
Dim waitOnReturn As Boolean: waitOnReturn = True 
Dim windowStyle As Integer: windowStyle = 1 
ErrorCode = wsh.Run(Ph, windowStyle, waitOnReturn)