【发布时间】:2016-02-22 05:58:40
【问题描述】:
我正在使用以下代码通过 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#,所以现在我需要弄清楚如何检查宏完成(可能是一个不同的问题)。
【问题讨论】:
-
是的,您的更新中有不同的问题。将您的发现写为“答案”,标记它以关闭线程,然后写一个新问题。
标签: c# vba excel office-interop