首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果宏在工作表中,不能通过interop运行?

如果宏在工作表中,不能通过interop运行?
EN

Stack Overflow用户
提问于 2016-02-22 05:58:40
回答 3查看 1.5K关注 0票数 2

我使用以下代码通过C# Excel互操作运行VBA宏:

代码语言:javascript
运行
复制
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中,运行成功。当我把它替换为:

代码语言:javascript
运行
复制
string macroName = "testThisMacro_s";

如果testThisMacro_s的代码在Sheet1中,则xlApp.Run()行将给出以下COM异常:

代码语言:javascript
运行
复制
Cannot run the macro ''someBk.xlsm'!testThisMacro_s'. 
The macro may not be available in this workbook or all macros may be disabled.

我检查了宏安全设置,它们确实设置为“禁用通知”,但是能够从模块而不是从工作表运行宏似乎表明这与应用程序级的宏安全性不同。

在对工作表中的宏进行互操作调用时,有什么不同吗?

更新:通过将调用更改为:

代码语言:javascript
运行
复制
string macroName = "Sheet1.testThisMacro_s"

但是,在宏完成之前,这个手似乎可以控制回C#,所以现在我需要弄清楚如何检查宏完成情况(可能是另一个问题)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-22 07:07:56

通过将调用更改为:

代码语言:javascript
运行
复制
string macroName = "Sheet1.testThisMacro_s"
票数 1
EN

Stack Overflow用户

发布于 2016-02-22 06:10:42

Worksheet对象是一个对象,对象是用类模块定义的。工作表、工作簿、用户表单;它们都是对象。如果没有对象的实例,就不能直接调用对象上的方法。

宏在标准模块之外工作,这些模块不是对象,不需要实例化。

Application.Run不能调用对象的方法,这就是为什么宏需要在标准模块中。

票数 4
EN

Stack Overflow用户

发布于 2016-02-22 11:24:29

一个帮助者不是要解决你的两个问题吗,re: Mat的Mug关于实例化的答复?

在一些标准模块中:

代码语言:javascript
运行
复制
Sub testHelperSubToBeCalledFromInterop
    Call Sheet1.testThisMacro_s
End Sub

编辑:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35546689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档