Call Outlook VBA code from c#

3

In visual studio I am creating an addin, in the addin_startup I am setting an Outlook application to

app = (Microsoft.Office.Interop.Outlook.ApplicationClass)(Marshal.GetActiveObject("Outlook.Application"));

then I am calling a runMacro function which I got from 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());

    }
}

I pass this function, my Outlook app object and the name of the macro to run in an array, as so...

RunMacro(app, new Object[] { "showFormDisplay" });

I get the following exception

Unknown name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))
c#
exception
outlook-addin
asked on Stack Overflow Nov 11, 2010 by tom • edited May 8, 2015 by niton

3 Answers

1

I don't know why you have your exact issue, I'd assume one or more parameters is incorrect but not sure since I've never done it the way you're trying to do it.

I'd suggest looking at the following article for a complete sample using somewhat different code, that you might be able to reuse in your code: HOW TO: Run Office Macros by Using Automation from Visual C# .NET

answered on Stack Overflow Nov 12, 2010 by Hans Olsson
0

I thik you're doing it right, but maybe you don't meet the security requirements! In order to run a macro, the office file needs to be a trusted source! It must be flagged via the Office Security Center or else you won't be able to execute macros. You also need to allow access to the VBA Object via the security center for an external app to call the macros!

answered on Stack Overflow Nov 12, 2010 by Falcon
0

I had the same problem, the article from Microsoft (HOW TO: Run Office Macros by Using Automation from Visual C#) doesn't help because it covers only calling Outlook macros from Word, Excel, and Access.

Now I finally found the solution on a French site! It covers sending from Python but works also with C#! French Python code: http://www.developpez.net/forums/d1239845/autres-langages/python-zope/bibliotheques-tierces/pywin32-appeler-macro-outlook/

So I ported it to C# with the function I need (where "FnSendMailSafe" is the macro name in 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.

Enjoy!

answered on Stack Overflow May 28, 2013 by user2429879 • edited May 28, 2013 by user2429879

User contributions licensed under CC BY-SA 3.0