15

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

我尝试了以下代码

location = FolderPath(ThisWorkBook.FullName) 

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

其次是

Shell(location &"runmybatch.sh")

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

4

7 回答 7

3

有几个惊喜让这件事变得棘手!

  1. Shell函数期望路径由:分隔,而不是/
  2. 脚本运行时,会将根 ( / ) 目录作为其工作目录

除此之外,您应该能够使用Shell命令运行 bash 脚本。以下是帮助您入门的分步说明。

  • 在 Desktop 目录中创建以下 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"
  • 计算器应用程序应该运行。
于 2012-06-26T23:46:46.927 回答
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"

这将返回带有:'s 的路径,我认为必须将其转换为/'s do shell script。这可以通过 AppleScriptquoted form of POSIX path of FilePathName_s或 VBA来完成FilePathName_s = "/" & Replace(FilePathName_s, ":", "/")

于 2012-09-07T00:01:23.813 回答
1

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

因为 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"""
      

      那确实是一个,两个,然后是三个双引号字符!(大概是转义双引号)

于 2014-01-03T22:50:13.737 回答
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)

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

于 2012-06-23T14:16:57.533 回答
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"完美运行!非常感谢大家。

____

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

于 2017-03-17T01:06:06.697 回答
0

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

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

Shell("bash runmybatch.sh")

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

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

其中 location 是工作簿目录的 / 分隔路径。单引号应注意路径中的任何空格或其他外来字符。

于 2012-06-24T14:42:50.783 回答
0

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

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

(记得在路径两边加上双引号)

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

于 2014-09-03T23:46:23.547 回答