2016-02-23 44 views
8

Cercando di stringa il titolo insieme era abbastanza di una sfida ...Passando attraverso una variante oggetto COM tramite PowerShell per eseguire una macro in PowerPoint

Sto cercando di eseguire alcune macro di PowerPoint da PowerShell. Sono diventato abbastanza bravo a eseguire macro da PowerShell per Excel. Quando eseguo le macro su Excel, il metodo Run() dall'oggetto COM prenderà una serie di argomenti, a seconda che la macro abbia qualche parametro. Tuttavia, d'altra parte, il metodo Run() di PowerPoint si aspetta parametri e non riesco a capire come passarli.

La mia macro si aspetta che una stringa venga passata attraverso, io ho cercato su Google in modo profuso e ho finito corto. Ho sempre trovato questo errore:

Errore:

type must not be ByRef 

ho messo insieme un PoC molto di base per PowerPoint in PowerShell:

Codice:

# 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 

Il la stessa macro sposta semplicemente del testo attraverso le finestre, funziona bene quando viene eseguita da PowerPoint.

Requisito:

Ora voglio automatizzare questo in più file e diapositive.

Documentation on the PowerPoint COM object Run method, che mostra il requisito per due parametri.

+0

Puoi postare la macro nel pptm (almeno la dichiarazione del sub)?Puoi dirci che tipo di riferimenti (Strumenti> Riferimenti) sono inclusi in esso? Puoi provare che (1) puoi mostrare una finestra di messaggio all'inizio della macro (2) Un'altra macro con gli stessi tipi di argomenti può essere eseguita dallo stesso file (3) Un'altra macro dallo stesso file senza argomenti può essere correre? (4) Qualunque macro dai file pptm può essere eseguita da PowerShell sul tuo computer? – z32a7ul

+0

Ho chiesto a questi perché la mia ipotesi è che l'errore non si verifica quando i parametri vengono passati alla Macro ma in seguito, e un'eccezione viene respinta e catturata infine da PowerShell. – z32a7ul

risposta

4

Ottima domanda e non molti esempi online come dici tu. Sono riuscito a spogliare ulteriormente il tuo esempio e passare con successo del testo a un MsgBox in una macro di PowerPoint senza realmente cambiare ciò che avevi.

la macro nella PowerShellTest.pptm file salvato in C: \ Temp

Sub DisplayMessage(myText As String) 
    MsgBox myText 
End Sub 

Lo script 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") 

Il legame metodo Run documentazione che hai fornito menziona il fatto che il nome del modulo può essere incluso quindi ha funzionato anche per me:

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

Grazie per l'esempio più semplice da provare, ho provato a eseguire il codice verbatim e ottengo esattamente lo stesso risultato, quindi ci deve essere qualcos'altro in gioco alla fine. – Chris

+1

Hmmm. Forse alcune delle impostazioni del centro di fiducia? Non canto il mio progetto macro (come faccio di solito), quindi non avrei dovuto eludere alcuni dei problemi più dettagliati di MSFT. –

+0

Questo sarebbe diverso dal centro di fiducia in Excel? Come sono in grado di eseguire macros bene attraverso PowerShell in Excel. Sto solo cercando di isolare il problema. – Chris

1

Forse provare a rimuovere il [ref] in la riga di codice sotto o provare a cambiare a [val]

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

Quindi, o:

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

o:

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

E poi anche fare in modo che la macro PowerPoint si aspetta la variabile da passare ByVal. Ad esempio qualcosa di simile:

Sub IAM(ByVal sMonthName As String) 
+0

Grazie per i suggerimenti! Quindi, l'opzione 1 (remove [ref]) dà l'errore: "type non deve essere ByRef" e l'opzione 2 ([val]) restituisce: "Impossibile trovare il tipo [val]. Assicurati che l'assembly che contiene questo tipo sia caricato." – Chris

+1

Forse la macro di PowerPoint si aspetta che l'argomento venga passato daRef? Hai controllato la firma della macro per assicurarti che non si aspetti che l'argomento venga passato daRef? –

+0

Ho aggiunto ByVal alla macro così come mi hai suggerito. Tutto ciò che fa è prendere una stringa e metterla in una MsgBox, esattamente come il suggerimento di Jamie nella prima risposta. – Chris