2012-02-13 6 views
2

Я застрял в течение нескольких часов по этой проблеме:Вызов VBA AddIn макрос из VSTO PowerPoint ленты

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

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

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

PPspliT.ppam является установленный AddIn (, который расположен здесь: 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

+1

«Еще одна вещь, которую я нахожу странной, заключается в том, что Run должен принимать два аргумента, даже если у макроса нет аргументов (поэтому я поместил null в качестве второго аргумента).« Run не требует этого, он может быть особенность пути.NET с COM/VBA, которые необходимы VB.NET для заполнения всех параметров, необязательных или нет. –

+0

Вы видите какую-либо ошибку при применении. Run? –

+0

Нет никакой ошибки, но ничего не происходит. Я попытался напрямую вызвать процедуру: Globals.ThisAddIn.Application.Run («PPspliT_main», null); но все равно ничего. На самом деле, если вы знаете другой способ использовать этот код VBA в моем проекте C#, было бы хорошо, так как у меня есть код надстройки PPspliT и это также pptm-файл. –

ответ

2

Эта вещь сводила меня с ума, но я нашел, как заставить ее работать! Вот что я сделал (используя этот 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"}); 

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

+1

Рад, что вы нашли ответ и спасибо за его отправку. Мои. Все это, чтобы заменить пару строк VBA/VB6. ;-) –

+0

Я все еще не понимаю, почему рефлексия должна быть явно использована и почему подход Application.Run() не работает. Я полагаю, это связано с тем, как .net обходит вокруг VB.net. Я новичок в все это, и иногда бывает неприятно видеть, как усложняются ситуации при использовании C# и как некоторые функции предоставляются для Excel и не для PowerPoint, например ... –

0

Прежде чем запрашивать его, попробуйте открыть макрос презентации (PPAM) (через Application.Presentations.Open). В MSDN reference для 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); 
+0

Здравствуйте, Спасибо за ваш ответ. К сожалению, это не работает и дает следующую ошибку: «System.Runtime.InteropServices.COMException» Дополнительная информация: Презентации (неизвестный член): Неверный запрос. Вы должны использовать Addins.Add для загрузки файлов Addin. // Загруженное состояние AddIn эквивалентно тому, как оно отмечено в Options> AddIns, поэтому нормально, что его нельзя открыть в виде презентации. –

0

Просто подъехала немного кода в VB6, который вызывает подпрограмму в загруженном надстройку

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

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

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

oPPTApp.Run "BlahBlah" 

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

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

+0

Спасибо за ответ. К сожалению, я пробовал это: Globals.ThisAddIn.Application.Run ("PPspliT_main", null); и все равно то же самое, ничего не происходит. У меня есть файл pptm надстройки PPspliT и его код, если вы знаете о другом способе использования этого кода VBA в моем проекте C#, он это сделает! Очень странно, что это не работает, так как кнопка PPspliT Add-in Ribbon просто вызывает процедуру PPspliT_main, и она работает в этом случае ... –

Смежные вопросы