我使用以下代码通过C# Excel互操作运行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#,所以现在我需要弄清楚如何检查宏完成情况(可能是另一个问题)。
发布于 2016-02-22 07:07:56
通过将调用更改为:
string macroName = "Sheet1.testThisMacro_s"发布于 2016-02-22 06:10:42
Worksheet对象是一个对象,对象是用类模块定义的。工作表、工作簿、用户表单;它们都是对象。如果没有对象的实例,就不能直接调用对象上的方法。
宏在标准模块之外工作,这些模块不是对象,不需要实例化。
Application.Run不能调用对象的方法,这就是为什么宏需要在标准模块中。
发布于 2016-02-22 11:24:29
一个帮助者不是要解决你的两个问题吗,re: Mat的Mug关于实例化的答复?
在一些标准模块中:
Sub testHelperSubToBeCalledFromInterop
Call Sheet1.testThisMacro_s
End Sub编辑:

https://stackoverflow.com/questions/35546689
复制相似问题