【问题标题】:How to call a Bash script from VBA (Excel)如何从 VBA (Excel) 调用 Bash 脚本
【发布时间】:2012-06-14 22:57:02
【问题描述】:

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

我尝试了以下代码

location = FolderPath(ThisWorkBook.FullName) 

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

紧随其后

Shell(location &"runmybatch.sh")

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

【问题讨论】:

  • 这个问题对stackoverflow.com/questions/6136798/…有帮助吗
  • 您不需要在位置和脚本名称之间包含一个“\”字符吗?祝你好运。
  • “Shell”命令需要一个 ':' 分隔路径,尽管这不是问题。我尝试了一个简单的 Shell 调用,其完全限定路径指向模式为 755 的 bash shell 文件,与 Excel 工作簿位于同一目录中,但我总是收到权限被拒绝错误。这似乎是一件很容易的事情,但我也做不到。
  • Joel,仔细检查父进程的所有者是否与脚本的所有者相同。相应地 chown 脚本或临时 chmod 以便任何人都可以执行它。 (757)
  • Saned 的“FolderPath”不是真实的东西......它必须是他自己的库中的一个函数......但不要担心。我将把赏金奖励给任何可以提供分步说明的人,这些人可以展示如何创建一个单行 bash 脚本,该脚本执行一些琐碎的操作,如触摸文件,与 Excel 启用宏的工作簿位于同一目录中,并且从 VBA 成功启动该脚本。

标签: excel vba bash macos


【解决方案1】:

有几个惊喜让这个过程变得棘手!

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

除此之外,您应该能够使用 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"
  • 计算器应用程序应该会运行。

【讨论】:

    【解决方案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"
    

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

    【讨论】:

      【解决方案3】:

      起初,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 剥离了扩展属性,然后乔尔的电话: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 是我的编辑器!

      【讨论】:

        【解决方案4】:

        我没有使用 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)
        

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

        【讨论】:

          【解决方案5】:

          我也无法让我的简单 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"""
              

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

          【讨论】:

            【解决方案6】:

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

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

            Shell("bash runmybatch.sh")
            

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

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

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

            【讨论】:

              【解决方案7】:

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

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

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

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

              【讨论】:

                猜你喜欢
                • 2012-10-19
                • 2014-01-14
                • 1970-01-01
                • 2011-06-01
                • 2013-08-10
                • 2017-02-23
                • 2021-04-23
                • 1970-01-01
                • 2012-07-23
                相关资源
                最近更新 更多