前提・実現したいこと
powershellでパワポVBAを動かしたいのですが、エラーが出てきてできません。
いくつか調べ、権限変更も行いましたが、わからず困っています。
ご教授いただけると幸いです。
発生している問題・エラーメッセージ
Application.Run : 用語 'Application.Run'は、コマンドレット、関数、スクリプト、ファイル、または操作可能なプログラム
該当のソースコード
(sample1.ps1) $file = "C:Users/Documents/sample.pptm" $power = New-Object -ComObject PowerPoint.Application $x = "a" try { $book = $power.Presentations.Open($file) Application.Run "macro1",x $book.Close() } finally { $power.Quit() [System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($power) | Out-Null }
(sample.pptm) Sub macro1() MsgBox("test") End Sub
試したこと
下記参考に実行ポリシー変更しました。
https://qiita.com/earthdiver1/items/b3f529c81f5892972a72
実行ポリシー変更
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
補足情報(FW/ツールのバージョンなど)
windows10
Windowspowershell
powerpoint2016
ちょっと動作試せてないのでこちらに書きます。
Applicationはpowershellにはないのでエラーはまさにそのことが表示されています。
ただ上の方で
$power = New-Object -ComObject PowerPoint.Application
$powerにPowerPoint.Applicationオブジェクトを生成しているので、
これがApplicationオブジェクトになっているはず。
$book.Run
で実行できるのでは?
Application については yureighost さんのおっしゃる通りかと。$book.Run ではなく $power.Run ではないかと思いますが。
これは余談ですが、どこにこれをしろと書いてあるのか、FinalReleaseComObject を使う人が多いですが、これは場合によっては危険です。
$power に $null を入れて [System.GC]::Collect() するのが良いと思います。
ご回答ありがとうございます。
$power.Runに変更し、試してみましたが、下記エラーが出てきてできません。
これは、また別のことが関係して出ているエラーでしょうか。
【エラー】
$power.Run "macro1",x
の後に式が存在しません。
$power.Run "macro1",x
式またはステートメントのトークン'x'を使用できません。
失礼。
上で$powerとして書いておきながら何故か下で$book.Runと書いてしまいました。
Zuishinさんの言っている通り、$power.Runが正しいです。
$power.Run はコマンドレットではなく COM メソッドなので呼び出し方が違います。$power.Run "macro1" x ではなく、$power.Run("macro1", $x) です。
何度も申し訳ございません。
$power.Run("macro1", $x)に変更し、実行すると、
型は ByRef であってはなりません
と出てくるのですが、ご教授いただけないでしょうか。
よろしくお願いいたします。
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/byref-argument-type-mismatch
これじゃないですか?
エラーメッセージにヒントがあると思うので正確に、繰り返しますが正確に、読み落としなく、繰り返しますが、読み落としなく、よく読んでください。
ご丁寧にありがとうございます。
まだ解決はしてませんが、参考に考えてみます。
考える前にエラーメッセージを正確に読みましょう。という意見です。リンク先を読めばわかると思いますが、マクロ側の問題だと思います。
これだけ繰り返して強調しても読まないことに驚きを隠せません。
言葉足らずで申し訳ございません。
上記リンクを拝読しましたが、理解が追いついていないため、
まだ解決はしていませんでした。
ありがとうございます。
上記リンクはともかく、くどくどと「正確に読んでください」と言ったのはエラーメッセージです。これを正確に(ななめ読みでなく)読めばどこで何が間違っているか書いてあると思います。
ありがとうございます。
マクロ側でByRefでない型で受け取るのだと考えましたが、
間違えているみたいなので、もう一度正確に読んでみます。
何度もご教授いただきまして大変感謝しております。
ちなみにpowershell(環境は7)でPowerPoint.Application.Runの引数形式を判定すると
SAFEARRAY(Variant)だとわかるのですが、これを作成するのが難しすぎてやや断念気味です。
$power = New-Object -ComObject PowerPoint.Application
$power.run
OverloadDefinitions
-------------------
Variant Run (string MacroName, SAFEARRAY(Variant) safeArrayOfParams)
冗長になりますがExcelマクロを介して、
PowerPointを呼べば、VBAのVariant型が引数なだけなので障害が少ないと思います。
どうしても難しい場合はそちらもご検討の程を。
ご丁寧にありがとうございます。
ご教授いただいた方法を2つとも検討してみます。
回答2件
あなたの回答
tips
プレビュー