2016-09-06 63 views
3

シェルを使ってうまく動作するvbaからpythonスクリプトを呼び出す必要があります。wshでvbaのpythonスクリプトを呼び出す

Sub CallPythonScript() 

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

End Sub 

しかし、wshを使用しようとすると(待ち時間のため)、もう機能しません。

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がインストールされたPythonインタプリタに拡張子.pyを関連付けているという事実に依存しています。

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

をして

この小さなテストコードはPythonがインストールされているに関係なく動作します(とスペースの問題点が消滅):(あなたが.batファイルを起動するのと同じよう)

ただ、これを行います

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 

(私はSiに持っていた:Excelで私のために働いたと私のシステム PATHであることを起こる pycrust.pyを走りました

+0

答えをありがとう。悲しいことにどちらのバージョンも私のために働く。私はエラー429を取得する最初のアプローチを使用してActiveXコンポーネントはオブジェクトを作成することはできません。 2番目の方法では、オブジェクト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) 
関連する問題