我正在使用以下代码通过C#Excel interop运行VBA宏:
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
中,并且运行成功。当我用以下代码替换它时:
string macroName = "testThisMacro_s";
其中testThisMacro_s
的代码位于Sheet1
,xlApp.Run()
行提供以下COM异常:
Cannot run the macro ''someBk.xlsm'!testThisMacro_s'.
The macro may not be available in this workbook or all macros may be disabled.
我检查了宏安全设置,它们确实设置为“禁用通知”,但能够从模块而不是从工作表运行宏似乎表明这是一个与应用程序级宏不同的问题安全
在对工作表中的宏进行互操作调用时,我是否需要做些什么?
更新:我可以通过将调用更改为:
来执行宏string macroName = "Sheet1.testThisMacro_s"
但似乎在宏完成之前,这手控制回C#,所以现在我需要弄清楚如何检查宏完成(可能是一个不同的问题)。
答案 0 :(得分:4)
relationship
对象是对象 - 对象是使用类模块定义的。工作表,工作簿,用户表单;他们都是对象。如果您没有该对象的实例,则不能只调用对象上的方法。
宏可以关闭标准模块,它们不是对象,也不需要实例化。
Worksheet
无法调用对象的方法,这就是宏需要在标准模块中的原因。
答案 1 :(得分:0)
我可以通过将调用更改为:
来执行宏string macroName = "Sheet1.testThisMacro_s"
答案 2 :(得分:0)