3

问题

我有这本 10 年前的 Excel 工作簿,里面有数以万计的 VBA 代码行,其中一些我必须更新。所以我萌生了用 Ruby 编写单元测试的疯狂想法……

问题

如何从 Ruby 调用 Excel 宏?

到目前为止我所拥有的

我有

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

此外,此 Excel 工作簿

  • 包含一个名为“Module1”的模块
  • 用一个叫做WriteToA1()and的宏
  • 另一个宏称为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"
4

1 回答 1

2

您需要提供 OLE 模块的只是宏名称

excel.run('WriteToA1')

另请注意,如果您想运行带有争论的宏,请使用:

excel.run('MarcoWithArgs', "Arg")
于 2012-06-10T04:27:49.290 回答