C# 从c调用Outlook VBA代码#

C# 从c调用Outlook VBA代码#,c#,exception,outlook-addin,C#,Exception,Outlook Addin,在visual studio中,我正在创建一个加载项,在加载项启动中,我正在将Outlook应用程序设置为 app = (Microsoft.Office.Interop.Outlook.ApplicationClass)(Marshal.GetActiveObject("Outlook.Application")); 然后我调用一个runMacro函数,它是我从msdn获得的 private void RunMacro(object oApp, object[] oRunArgs) {

在visual studio中,我正在创建一个加载项,在加载项启动中,我正在将Outlook应用程序设置为

app = (Microsoft.Office.Interop.Outlook.ApplicationClass)(Marshal.GetActiveObject("Outlook.Application"));
然后我调用一个runMacro函数,它是我从msdn获得的

private void RunMacro(object oApp, object[] oRunArgs)
{
   try
   {

        oApp.GetType().InvokeMember("Run", System.Reflection.BindingFlags.InvokeMethod, null, oApp, oRunArgs);
   }
   catch (Exception e)
   {
        MessageBox.Show(e.GetType().ToString());

    }
}
我传递此函数、Outlook应用程序对象和要在数组中运行的宏的名称,以便

RunMacro(app, new Object[] { "showFormDisplay" });
我得到以下例外

Unknown name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))

我不知道你为什么会有你的确切问题,我假设一个或多个参数是不正确的,但不确定,因为我从来没有这样做,你试图这样做


我建议您阅读下面的文章,了解使用不同代码的完整示例,您可以在代码中重用这些代码:

我认为您做得不错,但可能不符合安全要求!要运行宏,office文件必须是受信任的源!必须通过Office Security Center对其进行标记,否则您将无法执行宏。您还需要允许通过安全中心访问VBA对象,以便外部应用程序调用宏

我也遇到了同样的问题,Microsoft的文章(如何:使用Visual C#中的自动化运行Office宏)没有帮助,因为它只涉及从Word、Excel和Access调用Outlook宏

现在我终于在一个法国网站上找到了解决方案!它包括从Python发送,但也适用于C#!

因此,我将它移植到C#,并使用我需要的函数(其中“FnSendMailSafe”是Outlook 2007中的宏名称)

using Outlook = Microsoft.Office.Interop.Outlook;
object oMissing = System.Reflection.Missing.Value;

// create outlook object
Outlook.Application otApp = new Outlook.Application();

string[] arFunctionParameters =
            { 
                sTo,
                sCC,
                sBCC,
                sSubject,
                sBody
            };

// Run the macro
otApp.GetType().InvokeMember("FnSendMailSafe",
            System.Reflection.BindingFlags.Default |
            System.Reflection.BindingFlags.InvokeMethod,
            null, otApp, arFunctionParameters);

System.Runtime.InteropServices.Marshal.ReleaseComObject (otApp);
otApp = null;

GC.Collect();   //Garbage collection.

享受!

非常感谢您的帮助。这里的问题是示例中使用的函数似乎不适用于outlook对象,它们似乎是为word、excel access等定制的(尽管我很可能错了)如果还有其他想法,你提供的链接在使用access时就不起作用了:/@Tom:恐怕不行,我通常只是自动使用Excel和Word,我没有尝试过其他Office应用程序。我应该说outlook,而不是access:$答案仍然是一样的。这是一个背后的痛苦——实际上,创建inst并不难安装outlook,然后访问.otm文件中的相关宏。不幸的是,这超出了我的编程能力。感谢您尝试Hello。您最终找到解决方案了吗?我有同样的要求,即使使用@user2429879 answer,也无法使其工作。