2016-02-23 11 views
8

में किसी मैक्रो को चलाने के लिए स्ट्रिंग के लिए एक साथ शीर्षक कोशिश कर रहा है एक चुनौती के लिए पर्याप्त था ...PowerPoint

मैं PowerShell से कुछ PowerPoint मैक्रो को चलाने के लिए कोशिश कर रहा हूँ PowerShell के माध्यम से COM वस्तु के माध्यम से एक प्रकार पासिंग। मुझे एक्सेल के लिए पावरहेल से मैक्रोज़ चलाने में काफी अच्छा लगा है। जब मैं एक्सेल पर मैक्रोज़ चलाता हूं, तो COM ऑब्जेक्ट से रन() विधि विभिन्न प्रकार के तर्क लेती है, भले ही मैक्रो के पास कोई पैरामीटर हो। हालांकि दूसरी ओर, पावरपॉइंट रन() विधि पैरामीटर की अपेक्षा करती है, और मैं उन्हें कैसे पास करना है, यह नहीं कर सकता।

मेरा मैक्रो एक स्ट्रिंग को पारित करने की उम्मीद कर रहा है, मैंने profusely googled और कम आ गया है।

त्रुटि::

type must not be ByRef 

मैं PowerShell में पावर प्वाइंट के लिए एक साथ डाल दिया है एक बहुत ही बुनियादी PoC:

कोड:

# 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 

The I हमेशा इस त्रुटि मिलती है मैक्रो स्वयं बस कुछ पाठ बॉक्स में ले जाता है, यह PowerPoint से चलाते समय ठीक काम करता है।

आवश्यकता:

मैं अब एक से अधिक फ़ाइलों और स्लाइड भर में इस स्वचालित करना चाहते हैं।

Documentation on the PowerPoint COM object Run method, दो पैरामीटर के लिए आवश्यकता दिखा रहा है।

+0

आप pptm में मैक्रो (उप के कम से कम घोषणा) पोस्ट कर सकते हैं?क्या आप हमें बता सकते हैं कि इसमें किस तरह के संदर्भ (उपकरण> संदर्भ) शामिल हैं? क्या आप इसका परीक्षण कर सकते हैं (1) क्या आप मैक्रो (2) की शुरुआत में एक संदेश बॉक्स दिखा सकते हैं, उसी प्रकार के तर्कों के साथ एक और मैक्रो उसी फ़ाइल से चलाया जा सकता है (3) तर्क के बिना एक ही फ़ाइल से एक और मैक्रो हो सकता है चलते हैं? (4) पीपीटीएम फाइलों से कोई मैक्रो आपके कंप्यूटर पर पावरशेल से चलाया जा सकता है? – z32a7ul

+0

मैंने इनसे पूछा क्योंकि मेरी परिकल्पना यह है कि त्रुटि तब नहीं होती जब पैरामीटर मैक्रो को सौंपे जाते हैं लेकिन बाद में, और एक अपवाद वापस फेंक दिया जाता है और अंततः पावरशेल द्वारा पकड़ा जाता है। – z32a7ul

उत्तर

4

महान प्रश्न और ऑनलाइन उदाहरण के बहुत से उदाहरण नहीं हैं। मैंने आपके उदाहरण को और भी नीचे फेंकने में कामयाब रहे और वास्तव में आपके पास जो कुछ भी था, उसे बिना किसी पावरपॉइंट मैक्रो में किसी संदेश को MsgBox में सफलतापूर्वक पास कर दिया।

फ़ाइल PowerShellTest.pptm सी में सहेजा में मैक्रो: \ अस्थायी

Sub DisplayMessage(myText As String) 
    MsgBox myText 
End Sub 

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

भागो विधि दस्तावेज़ लिंक आपके द्वारा दी गई उल्लेख मॉड्यूल का नाम हो सकता है कि शामिल है इसलिए यह मेरे लिए भी काम करता है:

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

कोशिश करने के लिए सरल उदाहरण के लिए धन्यवाद, मैंने आपके कोड वर्बैटिम को चलाने का प्रयास किया है और मुझे बिल्कुल वही आउटपुट मिलता है, इसलिए मेरे अंत में कुछ और होना चाहिए। – Chris

+1

हम्म। शायद कुछ ट्रस्ट सेंटर सेटिंग्स? मैंने अपने मैक्रो प्रोजेक्ट को गाया नहीं है (जैसा कि मैं आमतौर पर करता हूं) इसलिए मैं कुछ और वर्बोज एमएसएफटी मुद्दों को छोड़ नहीं रहा होता। –

+0

क्या यह एक्सेल में ट्रस्ट सेंटर से अलग होगा? क्योंकि मैं Excel में PowerShell के माध्यम से मैक्रोज़ ठीक चलाने में सक्षम हूं। बस समस्या को अलग करने की कोशिश कर रहा है। – Chris

1

शायद [ref] को हटाने का प्रयास करें नीचे दिए गए कोड की लाइन या [वैल]

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

तो करने के लिए इसे बदलने का प्रयास करें या तो:

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

या:

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

और फिर भी सुनिश्चित करें कि PowerPoint मैक्रो की उम्मीद कर रहा है परिवर्तनीय BYVal पारित करने के लिए। इस तरह उदाहरण कुछ के लिए:

Sub IAM(ByVal sMonthName As String) 
+0

सुझावों के लिए धन्यवाद! तो, विकल्प 1 (हटाएं [ref]) त्रुटि देता है: "प्रकार बीरफ नहीं होना चाहिए" और विकल्प 2 ([वैल]) देता है: "प्रकार [वैल] खोजने में असमर्थ। सुनिश्चित करें कि इस प्रकार की असेंबली है लदा हुआ।" – Chris

+1

हो सकता है कि पावरपॉइंट मैक्रो तर्क को आरएफ द्वारा पारित होने की अपेक्षा कर रहा है? क्या आपने यह सुनिश्चित करने के लिए मैक्रो हस्ताक्षर की जांच की है कि यह तर्क को आरएफ द्वारा पारित होने की अपेक्षा नहीं कर रहा है? –

+0

मैंने मैक्रो को ByVal जोड़ा जैसा आपने सुझाव दिया था। यह सब एक स्ट्रिंग लेता है और इसे पहले संदेश में जेमी के सुझाव की तरह, एक संदेश बॉक्स में डाल दिया जाता है। – Chris

संबंधित मुद्दे