我使用以下代码通过 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#,所以现在我需要弄清楚如何检查宏完成(可能是另一个问题)。
最佳答案
Worksheet
对象是一个对象 - 并且对象是使用类模块定义的。工作表、工作簿、用户表格;它们都是物体。如果您没有该对象的实例,则不能只调用该对象的方法。
宏在标准模块上工作,它们不是对象,并且不需要实例化。
Application.Run
无法调用对象的方法,这就是宏需要位于标准模块中的原因。
关于c# - 如果宏位于工作表中,无法通过互操作运行宏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35546689/