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)