C#VSTO for Outlook-触发VBA宏的按钮

时间:2018-09-07 06:57:02

标签: c# vsto outlook-addin outlook-vba

我正在尝试使用一个按钮来创建自定义功能区,该按钮会触发Outlook 2010中的VBA宏。功能区本身的创建工作正常,但该按钮不会触发VBA。

我尝试了以下解决方案:1)How-to: Run existing Word VBA Macros from C# Ribbon Addin,但是由于AFAIK Outlook.Application没有与Excel或Word相反的Run()方法,因此它引发了错误。

public void RunMacro(object otApp, object[] oRunArgs){

        otApp.GetType().InvokeMember("Run",
            System.Reflection.BindingFlags.Default |
            System.Reflection.BindingFlags.InvokeMethod,
            null, oApp, oRunArgs);
    }

        public void RunChronosMacro(Office.IRibbonControl control)
        {
            RunMacro(oApp, new object[] { "TestMacro" })
        }

2)此问题的第三个答案Call Outlook VBA code from c#,但它也会引发异常{"Unknow name. ( RESULT : 0x80020006 (DISP_E_UNKNOWNNAME))"}。也许这在Outlook 2007中有效,但在我的环境中却不起作用。由于此答案的灵感来自Python代码,因此我也曾在Python中尝试过此方法,但未成功。

public void RunChronosMacro(Office.IRibbonControl control)
{
    try
    {
        otApp.GetType().InvokeMember("TestMacro",
                    System.Reflection.BindingFlags.Default |
                    System.Reflection.BindingFlags.InvokeMethod,
                    null, otApp, arFunctionParameters);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(otApp);
                    otApp = null;
                    GC.Collect();
    }
    catch (Exception e)
    {
        MessageBox.Show(e.GetType().ToString());
    }

}

我对此非常刻苦,因为我对C#和Office加载项不是很熟悉,所以我不知道下一步该怎么做。预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

请尝试以下代码:

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

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

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

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

有关更多信息,请参考以下链接:

Need to run/invoke macro from c# code for Outlook Addin

How can I run a macro from a VBE add-in, without Application.Run?

希望它对您有所帮助!