Вызов макроса VBA AddIn из ленты VSTO PowerPoint - PullRequest
2 голосов
/ 13 февраля 2012

Я застрял на несколько часов с этой проблемой:

Я занимаюсь разработкой надстройки PowerPoint в C # и хочу использовать макрос из другой надстройки, которая представляет собой файл PPAM.Файл PPAM установлен и включен.

В справочнике по приложениям я обнаружил, что мне нужно использовать метод Application.Run, но я не могу заставить его работать ( ничего не происходит ) ... Вот мой код:

Globals.ThisAddIn.Application.Run("PPspliT.ppam!PPspliT.PPspliT_main", null);

PPspliT.ppam - это установленная надстройка (, которая находится здесь: C:\Users\XXXX\AppData\Roaming\Microsoft\AddIns\PPspliT\)

Модульв котором вызывается макрос PPspliT_main с именем PPspliT.

Еще одна вещь, которую я нахожу странной, заключается в том, что Run требует двух аргументов, даже если у макроса нет аргументов (, поэтомуЯ поставил null в качестве второго аргумента ).

Я также попытался программно установить AddIn, используя это:

String addinPath = @"C:\Users\XXXXX\AppData\Roaming\Microsoft\AddIns\PPspliT";
var macroFilePath = Path.Combine(addinPath, "PPspliT.ppam");
var addins = Globals.ThisAddIn.Application.AddIns.Add(macroFilePath);
if (!(addins.Registered == MsoTriState.msoTrue && addins.Loaded == MsoTriState.msoTrue))
{
  addins.Registered = MsoTriState.msoTrue;
  addins.Loaded = MsoTriState.msoTrue;
}
var app = Globals.ThisAddIn.Application;
string macroToInvoke = string.Format("{0}!{1}", "PPspliT.ppam", "PPspliT.PPspliT_main");
Globals.ThisAddIn.Application.Run(macroToInvoke, null);

Спасибо за вашу помощь!Acacio

Ответы [ 3 ]

2 голосов
/ 14 февраля 2012

Эта штука сводила меня с ума, но я нашел, как заставить ее работать!Вот что я сделал (используя это http://support.microsoft.com/kb/306682:

Итак, как я объяснил в своем вопросе, я сначала программно регистрируюсь и загружаю надстройку, затем я делаю следующее:

    private void RunMacro(object oApp, object[] oRunArgs)
    {
       oApp.GetType().InvokeMember("Run",
       System.Reflection.BindingFlags.Default |
       System.Reflection.BindingFlags.InvokeMethod,
       null, oApp, oRunArgs);
    }

Globals.ThisAddIn.RunMacro(Globals.ThisAddIn.Application , new object[] {"PPspliT_main"});

Спасибо всем за помощь!

0 голосов
/ 14 февраля 2012

Только что вытащил немного кода в VB6, который вызывает подпрограмму в загруженной надстройке

Предполагая ссылку на работающий экземпляр PPT в oPPTApp и подпрограмму Public в загруженной надстройке:

Public Sub BlahBlah()
   MsgBox "Hah!  You found me!"
End Sub

Это запустит его:

oPPTApp.Run "BlahBlah"

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

Опять же, это то, как это работает из VB5 / 6 или других подпрограмм VBA.

0 голосов
/ 13 февраля 2012

Вы должны попытаться открыть макрос с поддержкой презентации (PPAM) перед тем, как запросить его запуск (через Application.Presentations.Open). Ссылка MSDN для Application.Run указывает, что презентация должна быть загружена ( интерпретируется как означающее ранее открытое ).

Presentation ppam = Globals.ThisAddIn.Application.Presentations.Open(macroFilePath);
string macroToInvoke = string.Format("{0}!{1}", ppam.Name, "PPspliT.PPspliT_main");
Globals.ThisAddIn.Application.Run(macroToInvoke, null);
...