2010-11-11 103 views
2

在Visual Studio中,我创建一个插件,在addin_startup我设置的Outlook应用程序,以呼叫展望VBA代码从C#

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)) 

回答

1

我不知道为什么你有你确切的问题,我会承担一个或多个参数不正确,但不知道,因为我从来没做过你的方式试图去做。

我建议使用稍有不同的代码看着下面的文章为一个完整的样本,那你也许可以在你的代码重用:HOW TO: Run Office Macros by Using Automation from Visual C# .NET

+0

非常感谢您的帮助。这里的问题是,这个例子中使用的函数似乎不适用于Outlook对象,它们似乎是定制的单词,excel访问....(thres这是一个很好的机会,我错了) – tom 2010-11-12 11:50:56

+0

更多想法,你提供的链接只是不会工作当使用访问时:/ – tom 2010-11-15 10:10:21

+1

@Tom:恐怕不行,我通常只是自动化Excel和Word,我还没有尝试任何其他Office应用程序。 – 2010-11-15 10:27:01

0

我THIK你这样做是正确的,但也许你不符合安全要求!为了运行一个宏,办公文件需要成为一个值得信赖的来源!它必须通过Office安全中心进行标记,否则您将无法执行宏。您还需要通过外部应用程序的安全中心访问VBA对象以调用宏!

0

我有同样的问题,从Microsoft(如何:通过从Visual C#使用自动化运行Office宏)没有帮助,因为它只涵盖从Word,Excel和Access调用Outlook宏。

现在我终于在法国网站上找到了解决方案!它涵盖了从Python发送,但也适用于C#! French Python code: http://www.developpez.net/forums/d1239845/autres-langages/python-zope/bibliotheques-tierces/pywin32-appeler-macro-outlook/

所以我把它移植到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. 

享受!