如果它在工作表中,则无法通过互操作运行宏吗?

时间:2016-02-22 05:58:40

标签: c# excel vba excel-vba office-interop

我正在使用以下代码通过C#Excel interop运行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的代码位于Sheet1xlApp.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#,所以现在我需要弄清楚如何检查宏完成(可能是一个不同的问题)。

3 个答案:

答案 0 :(得分:4)

relationship对象是对象 - 对象是使用类模块定义的。工作表,工作簿,用户表单;他们都是对象。如果您没有该对象的实例,则不能只调用对象上的方法。

宏可以关闭标准模块,它们不是对象,也不需要实例化。

Worksheet无法调用对象的方法,这就是宏需要在标准模块中的原因。

答案 1 :(得分:0)

我可以通过将调用更改为:

来执行宏
string macroName = "Sheet1.testThisMacro_s"

答案 2 :(得分:0)

不会帮助你解决你的两个问题,重新:马克杯的Mug关于实例化的回复?

在某些标准模块中:

free(m_samBuf);
int bps = 2;
if(m_handle->codec->sample_fmts[0] == AV_SAMPLE_FMT_FLT) {
    bps = 4;
}
m_FrameSize = bps * m_handle->frame_size * m_handle->channels;
m_samBuf = malloc(m_FrameSize);
m_numSam = 0;

编辑:

enter image description here