2012-02-13 150 views
2

我已经遇到了这个问题的几个小时:呼叫VBA加载宏宏

我开发一个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模块。

我觉得奇怪的另一件事是,即使宏没有任何参数,运行需要两个参数(这就是为什么我把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); 

感谢您的帮助! Acacio

+1

“我发现奇怪的另一件事是,即使宏没有任何参数,Run也需要两个参数(这就是为什么我把null作为第二个参数的原因)。”运行并不需要它;它可能是一种特殊的方式。.NET接口与VB.NET需要的COM/VBA填充所有参数,可选或不可选。 – 2012-02-14 02:19:14

+0

您是否在application.Run中看到任何错误? – 2012-02-14 04:57:25

+0

不,没有错误,但没有任何反应。我试图直接调用例程:Globals.ThisAddIn.Application.Run(“PPspliT_main”,null);但仍然没有。事实上,如果你知道在我的C#项目中使用这个VBA代码的另一种方法,那么可以,因为我有PPspliT加载项的代码,它也是pptm文件。 – 2012-02-14 09:00:19

回答

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。 ;-) – 2012-02-14 15:45:51

+0

我仍然不明白为什么应该明确使用反射,为什么Application.Run()方法不起作用我想它与如何.net绕过VB.net ..我是新来的所有这一切,有时令人沮丧的是,看看如何使用C#时事情变得复杂,以及如何为Excel提供某些功能,而不是用于PowerPoint,例如... – 2012-02-14 22:46:00

0

您应该尝试打开启用演示文稿的宏(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); 
+0

你好,谢谢你的回答。不幸的是,这不起作用,并提供以下错误:'System.Runtime.InteropServices.COMException' 其他信息:演示文稿(未知成员):无效的请求。您必须使用Addins.Add来加载Addin文件// AddIn的加载状态相当于在选项> AddIns下打勾,因此无法将其作为演示文稿打开是正常的。 – 2012-02-13 15:59:53

0

就拉升了一下在VB6代码调用的程序的加载外接

假设在加载的添加式oPPTApp以PPT的运行实例的引用和公共子程序在:

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

这将启动它:

oPPTApp.Run "BlahBlah" 

请注意,您不需要provi de加载项的名称或子例程所在模块的名称。

同样,这是它从VB5/6或其他VBA例程中如何工作的。

+0

谢谢你的回答。不幸的是我试过这个:Globals.ThisAddIn.Application.Run(“PPspliT_main”,null);仍然一样,没有任何反应。我有PPspliT外接程序的pptm文件和它的代码,如果你知道在我的C#项目中使用这个VBA代码的另一种方法,它会这样做!它很奇怪,这不起作用,因为PPspliT插件功能区按钮只是调用PPspliT_main例程,它在这种情况下工作... – 2012-02-14 09:02:56