【问题标题】:Call VBA AddIn macro from VSTO PowerPoint Ribbon从 VSTO PowerPoint 功能区调用 VBA AddIn 宏
【发布时间】:2015-10-14 23:38:39
【问题描述】:

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

我正在用 C# 开发一个 PowerPoint 插件,我想使用另一个插件中的宏,它是一个 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 作为第二个参数的原因)。

我还尝试使用以下方式以编程方式安装插件:

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);

感谢您的帮助! 相思

【问题讨论】:

  • “我觉得奇怪的另一件事是 Run 需要两个参数,即使宏没有任何参数(这就是我将 null 作为第二个参数的原因)。”运行不需要它;这可能是 .NET 与 COM/VBA 接口的一种特殊方式,VB.NET 要求您填写所有参数,无论是否可选。
  • 您在 application.Run 中看到任何错误吗?
  • 不,根本没有错误,但什么也没发生。我试图直接调用例程: Globals.ThisAddIn.Application.Run("PPspliT_main", null);但仍然没有。实际上,如果您知道在我的 C# 项目中使用此 VBA 代码的另一种方法,那就没问题了,因为我有 PPspliT 插件的代码,它也是 pptm 文件。

标签: vba vsto powerpoint add-in


【解决方案1】:

这件事让我发疯了,但我找到了如何让它工作!这是我所做的(使用这个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"});

感谢大家的帮助!

【讨论】:

  • 很高兴您找到了答案,并感谢您将其发回。我的。所有这些都是为了替换几行 VBA/VB6。 ;-)
  • 我仍然不明白为什么应该显式使用反射以及为什么 Application.Run() 方法不起作用我想这与 .net 如何围绕 VB.net..我对这一切都很陌生,有时看到使用 C# 时事情变得复杂,以及某些功能是如何为 Excel 提供的,而不是为 PowerPoint 提供的,有时会令人沮丧......
【解决方案2】:

您应该在请求运行之前尝试打开启用演示的宏 (PPAM)(通过 Application.Presentations.Open)。 Application.RunMSDN reference 声明必须加载演示文稿(解释为以前打开过)。

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);

【讨论】:

  • 您好,感谢您的回答。不幸的是,这不起作用并给出以下错误:“System.Runtime.InteropServices.COMException”附加信息:演示文稿(未知成员):无效请求。您必须使用 Addins.Add 来加载 Addin 文件 // AddIn 的加载状态相当于在 Options>AddIns 下勾选它,因此无法将其作为演示文稿打开是正常的。
【解决方案3】:

刚刚在 VB6 中提取了一些代码,该代码在加载的加载项中调用例程

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

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

这将启动它:

oPPTApp.Run "BlahBlah"

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

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

【讨论】:

  • 感谢您的回答。不幸的是我试过这个: Globals.ThisAddIn.Application.Run("PPspliT_main", null);还是一样,什么也没有发生。我有 PPspliT 插件的 pptm 文件和它的代码,如果您知道在我的 C#project 中使用此 VBA 代码的另一种方法,那就可以了!很奇怪,这不起作用,因为 PPspliT 加载项功能区按钮只是调用 PPspliT_main 例程,并且在这种情况下它可以工作......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多