从PowerShell运行PowerPoint宏

3

我有一个带有以下宏的PowerPoint:

Sub test()
    MsgBox "testing"
End Sub 

以下是类似于这样的PowerShell脚本:

$ppt = New-Object -ComObject PowerPoint.Application
$presentation = $ppt.Presentations.Open("test.pptm")
$ppt.Run("test")

但是运行宏却出现以下错误:

找不到重载 "Run" 和参数计数: "1".
在 line:1 char:1
+ $ppt.Run("test")
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

例如,$presentation.application.run("test")$ppt.Run("test.pptm!test")也会出现相同的错误。

相关链接:

从PowerShell调用带有参数的Excel宏

通过PowerShell通过COM对象传递变量以运行PowerPoint中的宏

文档建议Run方法应该只需要将宏名称作为其第一个参数,所以我看不出哪里出了问题。

重载定义
-------------------
System.Object Run(string MacroName, [ref] Params System.Object[] safeArrayOfParams)
System.Object _Application.Run(string MacroName, [ref] Params System.Object[] safeArrayOfParams)

Application.Run Method (PowerPoint)


尝试将空数组作为第二个参数传递? 顺便提一下,你可能需要将“ModuleName.SubName”作为第一个参数。 - Jbjstam
我已经通过使用来自https://stackoverflow.com/questions/5544844/how-to-call-a-complex-com-method-from-powershell的Invoke-NamedParameter解决了我的问题。 - undefined
3个回答

0

基于这篇文章

$ppt = New-Object -ComObject PowerPoint.Application
$presentation = $ppt.Presentations.Open("test.pptm")
$presname = $presentation.Name
$VBScript = New-Object -ComObject "MSScriptControl.ScriptControl"
$VBscript.Language = "VBScript"
$VBscript.AddCode( 
@"
  Function RunVBA( app, functionName ) 
    RunVBA = app.Run( functionName, array() )
  End Function
"@
)

$VBscript.CodeObject.RunVBA( $ppt, "$presname!test" )

请注意,这仅适用于 Powershell x86,因为 ScriptControl 在 64 位环境中不可用。

0

试试这个:

$ppt = New-Object -ComObject powerpoint.application
$presentation = $ppt.presentations.Open("test.pptm")
$ppt.Run("test", @())

谢谢,但是这会输出:$ppt.Run("test", @()),类型不能是ByRef 位于:第1行第1个字符
  • $ob = $ppt.Run("test", @())
  • + CategoryInfo : OperationStopped: (:) [], ArgumentException + FullyQualifiedErrorId : System.ArgumentException
- user2987808
你可以尝试使用 $ppt.Run("test", [ref]@()) 吗? - sodawillow
我记得你可以只使用子程序的名称(即.Run("test"))在插件中调用公共子程序,但如果你想从已加载的PPT/PPTM文件中调用子程序,则需要使用类似于.Run("Test.pptm!test")的东西。 - Steve Rindsberg
两者在我的电脑上的行为相同。当未找到子程序时,您会收到此错误消息:Application.Run:无效请求。未定义子程序或函数。 - sodawillow

0

通过演示访问应用程序对象对我很有效:

$ppt = New-Object -ComObject PowerPoint.Application
$presentation = $ppt.Presentations.Open("test.pptm")
$presentation.Application.Run("test")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接