c# - 如果宏位于工作表中,无法通过互操作运行宏吗?

标签 c# vba excel office-interop

我使用以下代码通过 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/

相关文章:

c# - 检查 gridview 列复选框

excel - 如何选择列范围中的最后一个单元格?

c++ - 通过读取excel表为c文件中的变量赋值

excel - 如何使用 VBA 反转选定范围的 Excel 列的顺序

c# - ObservableCollection.AddRange 的最佳性能

c# - 在设计应用程序时如何使用 Func<> 和 Action<>?

c# - 如何在 ASP.net MVC 5 中限制对 Controller 操作的访问

excel - 缺少引用和 "Error in loading DLL"

vba - 检测比 Excel 窗口宽的 Excel 图表中的第一个和最后一个可见点

vba - 以编程方式添加工作簿事件并保存