2012-06-09 103 views
3

問題如何從Ruby運行Excel宏?

我用VBA代碼中有一個極大數行其中一些我要更新這組十的東西歲Excel工作簿。於是我只好寫在Ruby的單元測試的這個瘋狂的想法...

問題

我怎麼能叫Ruby中的Excel宏?

我有什麼到目前爲止

  • Excel工作簿中所謂的 「C:\ TEMP \ Test.xlsm」
  • 與所謂的 「工作表Sheet1」,並
  • 的表
  • 單元格「A1」。

此外,該Excel工作簿

  • 包含一個名爲 「模塊1」
  • 一個叫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. 

描述here我已啓用所有宏在Excel中。

Excel正在啓動,「Test.xlsm」打開。一定有什麼錯行:

excel.run "Sheet1!WriteToA1" 

我也試過這樣:

excel.run "Sheet1!Module1.WriteToA1" 
+0

試試這個'excel.run「Test!WriteToA1」' –

回答

1

所有你需要提供OLE模塊是宏的名稱

excel.run('WriteToA1') 

還要注意,如果你想運行一個與爭論的宏,你可以使用:

excel.run('MarcoWithArgs', "Arg") 
+0

這很有效,非常感謝! – Lernkurve