如果在工作表中,不能通过interop运行macros?

我正在使用下面的代码通过C#Excel互操作来运行VBAmacros:

public void macroTest() { Excel.Application xlApp = new Excel.Application(); xlApp.Visible = true; string bkPath = @"C:\somePath\someBk.xlsm"; Excel.Workbook bk = xlApp.Workbooks.Open(bkPath); string bkName = bk.Name; string macroName = "testThisMacro_m"; string runString = "'" + bkName + "'!"+macroName; xlApp.Run(runString); bk.Close(false); xlApp.Quit(); } 

testThisMacro_m在模块testMacro ,并且运行成功。 当我将其replace为:

 string macroName = "testThisMacro_s"; 

其中testThisMacro_sSheet1有其代码, xlApp.Run()行提供以下COMexception:

 Cannot run the macro ''someBk.xlsm'!testThisMacro_s'. The macro may not be available in this workbook or all macros may be disabled. 

我检查了macros安全设置,他们确实设置为“禁用通知”,但是能够从模块而不是从工作表运行macros似乎表明这是一个不同于应用程序级macros安全性的问题。

在工作表中对macros进行互操作时,有什么不同吗?

更新:我能够通过更改调用来执行macros来执行:

 string macroName = "Sheet1.testThisMacro_s" 

但似乎这是在macros完成之前将控制权交还给C#,所以现在我需要弄清楚如何检查macros完成(可能是一个不同的问题)。

Worksheet对象是一个对象 – 对象是用类模块定义的。 工作表,工作簿,用户表单; 他们都是对象。 而且,如果没有该对象的实例 ,则不能仅在对象上调用方法。

macros的标准模块不是对象,也不需要实例化。

Application.Run不能调用对象的方法,这就是为什么macros需要在标准模块中。

我能够通过将调用更改为:

 string macroName = "Sheet1.testThisMacro_s" 

Mat的马克杯的回答是否与实例有关?

在一些标准模块中:

 Sub testHelperSubToBeCalledFromInterop Call Sheet1.testThisMacro_s End Sub 

编辑:

在这里输入图像描述