Mac版Office 2011中的VBA Shell功能

问题描述

| 我正在尝试从Word 2011 for Mac中的VBA宏启动Shell脚本,该脚本将在Terminal窗口中运行。我已经尝试过同时使用Shell函数
MacScript
函数,但是无论哪种情况,VBA解释器似乎都无法找到该脚本。 根据VBA参考文档,以下应该起作用:
 RetVal = Shell(\"Macintosh HD:Applications:Calculator.app\",vbnormalFocus)
这将产生运行时错误53 \“找不到文件\”。 有什么建议么?     

解决方法

Mac上的
Shell()
VBA功能似乎要求完整路径为HFS样式的路径(用冒号而不是斜杠)。它也似乎不像Windows那样接受参数(如果添加了任何参数,则会报告“找不到路径”错误)。
MacScript()
VBA功能也可以使用:
MacScript(\"do shell script \"\"command\"\"\")
。这可能是最简单的选择,也是我建议做的事情。缺点是它有很多开销(每个呼叫100-200ms)。 另一种选择是标准C库中的
system()
函数:
Private Declare Function system Lib \"libc.dylib\" (ByVal command As String) As Long

Sub RunSafari()
    Dim result As Long
    result = system(\"open -a Safari --args http://www.google.com\")
    Debug.Print Str(result)
End Sub
有关文档,请参见http://pubs.opengroup.org/onlinepubs/009604499/functions/system.html。
system()
仅返回退出代码。如果要从命令获取输出,可以使用use8ѭ。
Private Declare Function popen Lib \"libc.dylib\" (ByVal command As String,ByVal mode As String) As Long
Private Declare Function pclose Lib \"libc.dylib\" (ByVal file As Long) As Long
Private Declare Function fread Lib \"libc.dylib\" (ByVal outStr As String,ByVal size As Long,ByVal items As Long,ByVal stream As Long) As Long
Private Declare Function feof Lib \"libc.dylib\" (ByVal file As Long) As Long

Function execShell(command As String,Optional ByRef exitCode As Long) As String
    Dim file As Long
    file = popen(command,\"r\")

    If file = 0 Then
        Exit Function
    End If

    While feof(file) = 0
        Dim chunk As String
        Dim read As Long
        chunk = Space(50)
        read = fread(chunk,1,Len(chunk) - 1,file)
        If read > 0 Then
            chunk = Left$(chunk,read)
            execShell = execShell & chunk
        End If
    Wend

    exitCode = pclose(file)
End Function

Sub RunTest()
    Dim result As String
    Dim exitCode As Long
    result = execShell(\"echo Hello World\",exitCode)
    Debug.Print \"Result: \"\"\" & result & \"\"\"\"
    Debug.Print \"Exit Code: \" & str(exitCode)
End Sub
请注意,上面示例中的几个
Long
参数是指针,因此,如果曾经发布64位版本的Mac Word,则必须更改它们。     ,希望您现在已经找到答案,但是您只需要完整的路径即可:
RetVal = Shell(\"Macintosh HD:Applications:Calculator.app:\" & _
              \"Contents:MacOS:Calculator\",vbNormalFocus)
另一个例子是:
RetVal = Shell(\"Macintosh HD:Users:brownj:Documents:\" & _
              \"rnaseq:IGV_2.0.14:igv.sh\",vbNormalFocus)
    ,另一个问题恰好像这样出现:由于AppleScript环境和用户的bash环境之间的差异,权限导致脚本失败。这次问答帮助我弄清楚了这一点。为了使脚本正常工作,我必须解决一些路径和权限问题(不是脚本本身,而是脚本所涉及的问题)。 这是我的建议,与使用AppleScript编辑器之前遇到的无意义的Excel错误相比,希望可以在故障排除过程中提供更好的见解: 使用AppleScript编辑器来确认该脚本实际上可以作为任何用户使用,并且可以使用任何环境变量: 在Spotlight中,开始键入\“ applescript editor \”,直到它出现,然后单击它。 创建一个新的AppleScript编辑器文件 将您的简单脚本键入新文件,而不用双引号引起来-我的读物
do shell script \"parseCsvAndOpen.sh\"
点击“运行”按钮以编写脚本 找出所有问题,进行更改,然后重复单击“运行”按钮,直到在AppleScript编辑器中执行它为止 好消息是,如果您需要返回StackOverflow或Google寻求帮助,则搜索范围会更窄;-) 现在,将您的简单脚本从AppleScript编辑器复制到您的vba,并确认它仍然有效 我能够将双引号加倍并将其放在MacScript代码之后的双引号中:
MacScript \"do shell script \"\"parseCsvAndOpen.sh\"\"\"
的确是一个,两个然后是三个双引号字符! (大概转义双引号)     ,不足以发表评论,但觉得这是Robin Knights回答的补充。当然还是要归功于他。 对于Excel 15.18(2015),标准C库中
system()
函数中使用的
open
调用不再需要
--args
关键字:
Private Declare Function system Lib \"libc.dylib\" (ByVal command As String) As Long

Sub RunSafari()
    Dim result As Long
    result = system(\"open -a Safari http://www.google.com\")
    Debug.Print Str(result)
End Sub
这很好。没有在2011年下进行测试。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...