如何从Ruby运行Excel宏?

3

问题

我有一个有着数万行VBA代码的Excel工作簿,它已经十几岁了,其中一些代码需要更新。所以我想疯狂地使用Ruby编写单元测试...

问题是

我该如何从Ruby中调用Excel宏?

到目前为止我所拥有的

我有:

  • 名为 "C:\temp\Test.xlsm" 的Excel工作簿
  • 一个名为 "Sheet1" 的工作表和
  • 一个单元格 "A1"

此外,这个Excel工作簿还包含:

  • 一个名为 "Module1" 的模块
  • 一个名为 WriteToA1() 的宏和
  • 另一个名为 ClearA1() 的宏

此外,我有一个像这样的Ruby脚本:

require 'test/unit'
require 'win32ole'

class TestDemo < Test::Unit::TestCase
   def testExcelMacro
    # Arrange
    excel = WIN32OLE.new("Excel.Application")
    excel.Visible = true
    excel.Workbooks.Open('C:\temp\Test.xlsm')

    # Act
    excel.run "Sheet1!WriteToA1"

    # Assert
    worksheet = excel.Workbooks.ActiveWorkbook
    assert_equal("blah", worksheet.Range("A1").Value)

    excel.Quit  
   end
end

异常

我遇到了这个异常

WIN32OLERuntimeError: (in OLE method `run': )
    OLE error code:800A03EC in Microsoft Excel
      Cannot run the macro 'Sheet1!WriteToA1'. The macro may not be available in this workbook or all macros may be disabled.
    HRESULT error code:0x80020009
      Exception occurred.

我已按照此处描述的方法启用了Excel中的所有宏。这里是具体步骤。
Excel正在启动,“Test.xlsm”被打开。该行代码可能存在问题:
excel.run "Sheet1!WriteToA1"

我也尝试过这个方法:
excel.run "Sheet1!Module1.WriteToA1"

尝试运行此代码:excel.run "Test!WriteToA1" - Siddharth Rout
1个回答

2
你只需要提供宏名称,即可提供OLE模块。
excel.run('WriteToA1')

此外请注意,如果您想要用参数运行一个宏,可以使用以下方法:
excel.run('MarcoWithArgs', "Arg")

有没有可能我们可以使用win32ole编写/修改宏?或者直接在Ruby中处理?我需要一些库,但我只能在“VBA Studio->Reference”中找到,而且我更喜欢动态生成宏,任何提示都会很感激 :),@Lernkurve - Jack Wu
哇,我也在寻找这个解决方案,我需要用 Ruby 编写/修改宏。 - Jesse JunJing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接