2017-04-10 34 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。无论如何,宏可以做一些令人讨厌的事情,但是为了避免额外的代码被执行,无论如何都应该加入一些保护措施。