vba powershell powerpoint powerpoint-vba

vba - Pasar una variante a través de un objeto COM a través de PowerShell para ejecutar una macro en PowerPoint



powerpoint-vba (2)

Tratar de encadenar el título fue suficiente desafío ...

Estoy intentando ejecutar algunas macros de PowerPoint de PowerShell. Me he vuelto bastante bueno en ejecutar macros de Powershell para Excel. Cuando ejecuto las macros en Excel, el método Run () del objeto COM tomará una variedad de argumentos, dependiendo de si la macro tiene algún parámetro. Sin embargo, por otro lado, el método PowerPoint Run () espera parámetros, y no puedo encontrar la forma de pasarlos.

Mi macro espera que se pase una cadena, busqué en Google profusamente y me quedé corto. Siempre obtengo este error:

Error:

type must not be ByRef

He creado un PoC muy básico para PowerPoint en PowerShell:

Código:

# PowerPoint test Add-type -AssemblyName office $PowerPoint = New-Object -comobject PowerPoint.Application $PowerPoint.Visible = [Microsoft.Office.Core.MsoTriState]::msoTrue $presentation2 = $PowerPoint.Presentations.open("C:/macros.pptm") $presentation = $PowerPoint.Presentations.open("C:/Test For Macros.pptx") $PowerPoint.run("macros.pptm!IAM",[ref]"Feb") $presentation.save() $presentation.close() $presentation2.close() $PowerPoint.quit() # extra clean up omitted

La macro en sí misma solo mueve texto entre cuadros, funciona bien cuando se ejecuta desde PowerPoint.

Requisito:

Ahora quiero automatizar esto en múltiples archivos y diapositivas.

Documentación en el objeto COM de PowerPoint Método de ejecución , que muestra el requisito de dos parámetros.


Gran pregunta y no muchos ejemplos en línea como dices. Me las arreglé para tirar tu ejemplo aún más y pasar con éxito un poco de texto a un MsgBox en una Macro de PowerPoint sin cambiar realmente lo que tenías.

La macro en el archivo PowerShellTest.pptm guardada en C: / Temp

Sub DisplayMessage(myText As String) MsgBox myText End Sub

El script de PowerShell:

# PowerPoint test Add-type -AssemblyName office $PowerPoint = New-Object -comobject PowerPoint.Application $PowerPoint.Visible = [Microsoft.Office.Core.MsoTriState]::msoTrue $presentation = $PowerPoint.Presentations.open("C:/Temp/PowerShellTest.pptm") $PowerPoint.run("PowerShellTest.pptm!DisplayMessage",[ref]"Feb")

El enlace de la documentación del método Run que proporcionó menciona que el nombre del módulo puede estar incluido, así que esto también funcionó para mí:

$PowerPoint.run("PowerShellTest.pptm!Module1.DisplayMessage",[ref]"Feb")


Tal vez intente eliminar el [ref] en la línea de código a continuación o intente cambiarlo a [val]

$PowerPoint.run("macros.pptm!IAM",[ref]"Feb")

Entonces o bien:

$PowerPoint.run("macros.pptm!IAM","Feb")

o:

$PowerPoint.run("macros.pptm!IAM",[val]"Feb")

Y luego también asegúrese de que la macro de PowerPoint espera que ByVal pase la variable. Por ejemplo algo como esto:

Sub IAM(ByVal sMonthName As String)