如何从VBA(Excel)调用Bash脚本

时间:2012-06-14 22:57:02

标签: macos bash vba excel-vba-mac

如何在MAC OSX上使用VBA运行bash文件

我尝试了以下代码

location = FolderPath(ThisWorkBook.FullName) 

返回当前目录减去文件名。

接着是

Shell(location &"runmybatch.sh")

我这样做是因为bash脚本与excel电子表格位于同一文件夹中。

7 个答案:

答案 0 :(得分:3)

有一些令人惊讶的惊喜!

  1. Shell 功能要求路径以分隔,而不是 /
  2. 当脚本运行时,它将根( / )目录作为其工作目录
  3. 除此之外,您应该能够使用 Shell 命令运行bash脚本。以下是帮助您入门的分步说明。

    • 在桌面目录中创建以下bash脚本,并将其命名为 test.sh
    #!/bin/bash
    open /Applications/Calculator.app/
    
    • 确保test.sh可执行(从终端窗口 chmod + x test.sh
    • 尝试运行它(在终端中输入 ./ test.sh )。应该出现计算器应用程序。退出那个。
    • 运行Excel并创建新工作簿 Workbook1
    • 将此空白工作簿保存在桌面目录中,作为启用宏的工作簿
    • 运行VB:工具>宏> Visual Basic编辑器
    • 如果未显示即时窗口,查看>即时窗口
    • 在即时窗口中,键入以下VBA代码:
     Shell ActiveWorkbook.Path & ":test.sh"
    
    • 应该运行计算器应用程序。

答案 1 :(得分:2)

我对shell命令没有运气,但是这里通过Excel 2011中的applescript对我有用:

script_s = "do shell script ""/Users/user/path/to/script/rubyscript_09.rb"""
MacScript script_s

我发现有必要让脚本使用'#!/usr/bin/env ruby'的shebang(在安装ruby版本管理器之后)

要解决调用文件文件夹子文件夹中的文件,请使用:

FilePathName_s = ThisWorkbook.Path & ":subfolder:filename"

这将返回:的路径,我认为必须将其转换为/的{​​{1}}。这可以使用AppleScript do shell script或VBA quoted form of POSIX path of FilePathName_s

来完成

答案 2 :(得分:1)

我没有使用FolderPath命令,它似乎不适合我,所以我稍后会调查为什么不。下面是我测试的一些示例代码,以确保可以从OSX Excel运行.sh文件。

我以前测试的.sh文件放在我的桌面上,只包含以下行:“open /Applications/Calculator.app”

在OSX上从Excel调用.sh的VBA代码如下:

Dim DesktopFolder As String
DesktopFolder = MacScript("return (path to desktop folder) as string")

Dim ScriptFile As String
ScriptFile = DesktopFolder & "test.sh"

RetVal = Shell(ScriptFile, vbNormalFocus)

我决定检查它是否仅在某些文件夹上起作用,所以我将.sh文件移动到/ tmp文件夹并且无法执行该文件,无论我如何编码路径,只是得到“文件未找到错误”。终于意识到OSX上的/ tmp文件是映射到/ private / tmp的符号链接,当我使用该路径时,它似乎再次正常工作。

Dim ScriptFile As String
ScriptFile = "Macintosh HD:private:tmp:test.sh"
RetVal = Shell(ScriptFile, vbNormalFocus)

无论如何,希望它有所帮助。我将继续寻找更好的方法,需要一些东西来动态地找到文件位置的可靠性。

答案 3 :(得分:1)

我也很难让我的简单bash脚本工作,即使我在全局路径(/ usr / bin)上有它,并且所有用户都具有读取和执行权限。有两件事导致我的脚本失败:由于AppleScript环境与用户的bash环境之间的差异导致的权限和路径。我发现VBA Shell function in Office 2011 for Mac的讨论更有助于解决我的问题。这是我最终确定的过程。

由于Excel掩盖了底层细节,我建议使用AppleScript编辑器,这有助于在您的故障排除过程中提供比我看到的无意义的Excel错误更好的洞察力:

  1. 使用AppleScript编辑器确认脚本实际上可以像任何用户一样工作,也可以使用任何环境变量:

    1. 在Spotlight中,开始键入“applescript editor”直到它出现,然后单击它
    2. 创建新的AppleScript编辑器文件
    3. 将新的简单脚本输入新文件,而不用加倍双引号 - 我的读取

      do shell script "parseCsvAndOpen.sh"
      
    4. 点击脚本的“运行”按钮
    5. 追踪任何问题,进行更改,然后重复点击“运行”按钮,直到从AppleScript编辑器中执行该操作
      • 这里的好消息是,如果您需要返回StackOverflow或Google寻求帮助,您可以进行较窄的搜索; - )
  2. 现在将您的简单脚本从AppleScript编辑器复制到您的vba并确认它仍然有效

    1. 我能够将我的双引号加倍并在MacScript代码后用双引号括起来:

      MacScript "do shell script ""parseCsvAndOpen.sh"""
      

      这确实是一个,两个,然后三个双引号字符! (大概是逃避双引号)

答案 4 :(得分:1)

起初,Joel的优秀教程对我不起作用(在OS X 10.11.6和Excel for Mac 2011上)。经过一番调查后,我发现我的问题是由扩展属性"在我的脚本文件test.sh中。在终端中,ls -l test.sh产生:

  -rwxr-xr-x@ 1 tgk  staff  456 Mar 16 13:12 test.sh

请注意" @"表示存在扩展文件属性。通过调用ls -l@ test.sh来提供更多信息,其产生:

-rwxr-xr-x@ 1 tgk  staff  456 Mar 16 13:12 test.sh
      com.apple.FinderInfo   32 
      com.apple.TextEncoding     15

换句话说,根据文件的创建方式,它可能有也可能没有扩展属性。所以我通过xattr -c test.sh剥离了扩展属性,然后是Joel的调用:Shell ActiveWorkbook.Path & ":test.sh"完美无缺!非常感谢大家。

____

我后来了解到,通过首先在Terminal中调用defaults write com.barebones.textwrangler WriteExtendedAttributes never,可以在TextWrangler中保存shell脚本而无需编写扩展属性。但是,这只会阻止添加com.apple.FinderInfo属性; com.apple.TextEncoding属性仍然存在。但幸运的是,当shell脚本只有com.apple.TextEncoding扩展属性时,Joel的VBA脚本命令现在可以正常工作!所以,TextWrangler是我的编辑器!

答案 5 :(得分:0)

我没有安装MS Office for Mac,所以我无法测试我建议的答案。我想应该可以调用Bash二进制文件(即/ bin / bash)并传递要作为参数执行的脚本的名称。这将避免使用权限位的任何问题,并确保第二个参数的路径名是通常的Unix样式/分隔的路径名。对于第一个参数,通过名称调用bash可能就足够了,没有任何路径,因为它应该使用PATH环境变量。

总而言之,仍然没有经过测试,我试试这个:

Shell("bash runmybatch.sh")

或者,如果由于工作目录不正确而无效,

Shell("bash '" & location & "/runmybatch.sh'")

其中location是工作簿目录的/ -separated路径。 sngle引号应该照顾路径中的任何空格或其他异域字符。

答案 6 :(得分:0)

您需要做的是在VBA宏中编写以下命令:

Shell "C:Path\to\script\location\script.sh"

(请记住在路径周围加上双引号)

获取脚本位置的最佳方法是录制宏以将工作簿保存在bash脚本所在的同一文件夹中。这样,您可以稍后查看Excel如何调用该路径并将其复制/粘贴到上面的shell命令中。