2017-04-10 87 views
0

我在OSX上的Excel 365中有一個VBA宏,我想啓動一個外部進程(一個python腳本),它將生成一個文件導入Excel。如何在OSX上從Excel 365 VBA啓動外部python進程?

我已經嘗試了很多東西,但都沒有爲我工作。我已在下面列出它們。

我第一次嘗試是使用:

Shell ("/usr/local/bin/python /tmp/myScript.py") 
>> Run-time error '76': Path not found 

然後我讀它首選舊的Mac風格的路徑,所以沒有

Shell ("Macintosh HD:usr:local:bin:python /tmp/myScript.py") 
>> Run-time error '76': Path not found 

這一點,在我的系統,是一個符號鏈接,因爲我使用的是HomeBrew,因此我解析了鏈接指向的位置並運行了該代碼:

Shell ("Macintosh HD:usr:local:Cellar:python:2.7.10_2:Frameworks:Python.framework:Versions:2.7:bin:python /tmp/myScript.py") 
>> Run-time error '76': Path not found 

並且爲了防萬一,裏德是一個具有UNIX風格路徑:

Shell ("/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/bin/python /tmp/myScript.py") 
>> Run-time error '76': Path not found 

然後我試圖使用MacScript運行它:

MacScript ("do shell script " + Chr(34) + "/usr/local/bin/python /tmp/myScript.py" + Chr(34)) 
>> Run-time error '5': Invalid procedure call or argument 

所以,在我看來,MacScript()不可用在此版本中VBA的。

後來我發現描述如何揭示libc中的system方法的文章:

Private Declare Function system Lib "libc.dylib" (ByVal command As String) As Long 
system("/usr/local/bin/python /tmp/myScript.py") 
>> Compile error: The code in this project must be updated for use on 64-bit systems. Please review and update DEclare statements and then mark them with the PtrSafe attribute. 

做了一些更多的挖掘來檢查,我要補充這給了我:

Private Declare PtrSafe Function system Lib "libc.dylib" (ByVal command As String) As Long 
system("/usr/local/bin/python /tmp/myScript.py") 
>> Run-time error '453': File not found: libc.dylib 

認爲它可能是sym-link相關的,我發現有一個sym鏈的鏈接libc.dylib -> libSystem.dylib -> libSystem.B.dylib,所以我試過的最後一件事是:

Private Declare PtrSafe Function system Lib "libSystem.B.dylib" (ByVal command As String) As Long 
system("/usr/local/bin/python /tmp/myScript.py") 
>> Run-time error '453': File not found: libSystem.B.dylib 

這就是我設法得到的。有人能從這裏指出我的正確方向嗎?

謝謝

回答

0

我花了一段時間,但我想出瞭如何做到這一點。

Excel 2016已將MacScript()替換爲AppleScriptTask()。這需要給予一個AppleScript文件和函數來調用,並且不能,據我所知,給予原始的AppleScript命令。

我創建了一個名爲PythonCommand的AppleScript文件。SCPT含有類似:

on PythonCommand(pythonScript) 
    do shell script "/usr/local/bin/python " & pythonScript 
end PythonCommand 

這個AppleScript的文件需要再放置在~/Library/Application Scripts/com.microsoft.Excel/(創建這個文件夾,如果不存在的話)

一旦在這裏,該功能可以使用稱爲:

Dim result As String 
result = AppleScriptTask("PythonCommand.scpt", "PythonCommand", pythonScript) 

(它堅持在返回的東西 - 它不會沒有這方面的工作)

的安全條件:

  • 任何Excel宏都可以調用此AppleScript。無論如何,宏可以做一些令人討厭的事情,但是爲了避免額外的代碼被執行,無論如何都應該加入一些保護措施。