Вызов Outlook VBA код из C # - PullRequest
       13

Вызов Outlook VBA код из C #

3 голосов
/ 11 ноября 2010

В Visual Studio я создаю надстройку, в addin_startup я устанавливаю приложение 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))

Ответы [ 3 ]

1 голос
/ 12 ноября 2010

Я не знаю, почему у вас есть точная проблема, я бы предположил, что один или несколько параметров неверны, но не уверен, поскольку я никогда не делал это так, как вы пытаетесь это сделать.

Я бы посоветовал посмотреть в следующей статье полный пример с использованием несколько иного кода, который вы могли бы повторно использовать в своем коде: КАК: запускать макросы Office с помощью автоматизации из Visual C # .NET

0 голосов
/ 28 мая 2013

У меня была та же проблема, статья от Microsoft (КАК: запускать макросы Office с помощью автоматизации из Visual C #) не помогает, потому что она касается только вызова макросов Outlook из Word, Excel и Access.

Теперь я наконец нашел решение на французском сайте!Он охватывает отправку из Python, но работает и с C #! Код французского Python: 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.

Наслаждайтесь!

0 голосов
/ 12 ноября 2010

Я думаю, вы все делаете правильно, но, возможно, вы не соответствуете требованиям безопасности!Для запуска макроса офисный файл должен быть надежным источником!Он должен быть помечен через Центр безопасности Office, иначе вы не сможете выполнять макросы.Вам также необходимо разрешить доступ к объекту VBA через центр безопасности для внешнего приложения для вызова макросов!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...