【问题标题】:Run PowerPoint Macro from PowerShell从 PowerShell 运行 PowerPoint 宏
【发布时间】:2017-01-09 11:13:01
【问题描述】:

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

Sub test()
    MsgBox "testing"
End Sub 

还有一个像这样的 PowerShell 脚本:

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

但运行宏只会给出:

找不到“运行”和参数计数的重载:“1”。
在行:1 字符:1
+ $ppt.Run("测试")
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

我得到同样的错误,例如$presentation.application.run("test")$ppt.Run("test.pptm!test").

相关:

Calling Excel macros from PowerShell with arguments

Passing a variant through COM object via PowerShell to run a macro in 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”作为第一个参数

标签: vba powershell powerpoint


【解决方案1】:

试试这个:

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

【讨论】:

  • 谢谢,但这给出了: $ppt.Run("test", @()) 类型不能是 ByRef At line:1 char:1 + $ob = $ppt.Run("test ", @()) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], ArgumentException + FullyQualifiedErrorId : System .ArgumentException
  • 你可以试试$ppt.Run("test", [ref]@())吗?
  • ISTR,您可以仅使用子名称(即 .Run("test") 但如果您想从加载的 PPT/ PPTM 文件,您需要使用类似 .Run("Test.pptm!test")
  • 两者在我的计算机上的行为相同。当未找到 sub 时,您会收到此错误:Application.Run : Invalid request. Sub or function not defined.
【解决方案2】:

基于this post:

$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 位环境中不可用。

【讨论】:

    【解决方案3】:

    通过演示文稿访问 Application 对象对我有用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-27
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多