从VSTO PowerPoint功能区调用VBA AddIn宏

时间:2012-02-13 13:48:35

标签: vba vsto powerpoint add-in

我在这个问题上被困了几个小时:

我正在使用C#开发PowerPoint AddIn,我想使用来自另一个AddIn的宏,这是一个PPAM文件。已安装并启用PPAM文件。

在应用程序参考中,我发现我需要使用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

3 个答案:

答案 0 :(得分: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 :(得分:0)

您应该尝试在请求运行之前打开启用演示文稿的宏(PPAM)(通过Application.Presentations.Open)。 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); 表示必须加载演示文稿(解释为先前已打开)。

{{1}}

答案 2 :(得分:0)

在VB6中调出一些代码,调用加载的加载项中的例程

假设在oPPTApp中引用了正在运行的PPT实例,并在加载的加载项中引用了一个Public子例程:

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

这将启动它:

oPPTApp.Run "BlahBlah"

请注意,您无需提供加载项的名称或子例程所在模块的名称。

同样,这是它在VB5 / 6或其他VBA例程中的工作原理。