1

我有一些想要从 Excel VBA 运行的 Jruby/Celerity 脚本,然后将脚本结果输出到 Excel 工作表。这可能吗?任何人都可以提出一种潜在的方法或一些潜在的资源。

我希望达到的目标:

  1. Mac Excel 2011 VBA 代码调用 Celerity 脚本并传递脚本将使用的参数。
  2. 脚本执行,利用 VBA 传递的参数。
  3. 脚本完成其执行并将结果返回到 Excel 工作表。

编辑:我还应该提到我在 Mac 上运行 Excel 2011。我的困惑之一是,我在使用 ruby​​ 自动化 Excel 时发现的所有内容似乎都假设为 Windows 操作系统。(# 需要 WIN32OLE 库)。我会使用在 OS X 下运行 excel 的同一个库吗?

非常感谢。

4

1 回答 1

2

示例解决方案

简单测试.rb

require "rubygems"
require "celerity"

word_to_search = ARGV[0]
word_to_check = ARGV[1]
#puts "DEBUG - word_to_search: #{word_to_search}"
#puts "DEBUG - word_to_check: #{word_to_check}"
browser = Celerity::Browser.new
browser.goto('http://www.google.com')
browser.text_field(:name, 'q').value = word_to_search
browser.button(:name, 'btnG').click
puts browser.text.include? word_to_check

假设我们必须将Mac 上的 Excel 2011与这个简单的脚本连接起来,该脚本接受几个输入参数并返回一个结果

测试.sh

#!/bin/bash --login
rvm use jruby > NULL
ruby simpletest.rb $1 $2

我们编写了一个可以通过 VBA 代码调用的 shell;请注意设置适当的权限 chmod u+x test.sh shebang:#!/bin/bash --login这是运行rvm以选择 jruby 所必需的(这是唯一支持的 rubycelerity

VBA 模块(用户定义函数)

Public Function SimpleTest(sWordToSearch, sWordToCheck)
    Dim sCommand As String
    sCommand = "do shell script ""cd /Users/ronda/projects/so-test1; ./test.sh "
    sCommand = sCommand & sWordToSearch & " "
    sCommand = sCommand & sWordToCheck & """"
    SimpleTest = MacScript(sCommand)
End Function

这段代码中的注意事项:/Users/ronda/projects/so-test1是我们脚本的路径

使用与测试

测试公式中的用户定义函数

SimpleTest 用户定义函数用法

顺便说一句,可以通过将脚本运行到较低级别来简化问题的诊断:

在 AppleScript 编辑器中测试在此处输入图像描述

在终端中测试 shell 脚本

$ cd ~/projects/so-test1  
$ ./test.sh Ruby Language
true
$ ./test.sh Fish Language
false

独立测试 jruby 脚本

$ rvm use jruby
Using /Users/ronda/.rvm/gems/jruby-1.7.11
$ ruby simpletest.rb Ruby Language
true
$ ruby simpletest.rb Ruby Fish    
false

进一步阅读

只是几个有用的链接:

  1. 阅读如何从 Excel VBA for Mac 2011 发出 HTTP GET作为使用popen 和管道的替代(可能是最强大的)方法的答案
  2. 访问您的自定义函数
于 2014-07-09T20:31:50.187 回答