質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

3635閲覧

powershellが実行できません。

SAMUSAMUN

総合スコア32

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/08/27 00:55

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yureighost

2020/08/27 01:22

ちょっと動作試せてないのでこちらに書きます。 Applicationはpowershellにはないのでエラーはまさにそのことが表示されています。 ただ上の方で $power = New-Object -ComObject PowerPoint.Application $powerにPowerPoint.Applicationオブジェクトを生成しているので、 これがApplicationオブジェクトになっているはず。 $book.Run で実行できるのでは?
Zuishin

2020/08/27 01:40

Application については yureighost さんのおっしゃる通りかと。$book.Run ではなく $power.Run ではないかと思いますが。 これは余談ですが、どこにこれをしろと書いてあるのか、FinalReleaseComObject を使う人が多いですが、これは場合によっては危険です。 $power に $null を入れて [System.GC]::Collect() するのが良いと思います。
SAMUSAMUN

2020/08/27 01:54 編集

ご回答ありがとうございます。 $power.Runに変更し、試してみましたが、下記エラーが出てきてできません。 これは、また別のことが関係して出ているエラーでしょうか。 【エラー】 $power.Run "macro1",x の後に式が存在しません。 $power.Run "macro1",x 式またはステートメントのトークン'x'を使用できません。
yureighost

2020/08/27 01:51

失礼。 上で$powerとして書いておきながら何故か下で$book.Runと書いてしまいました。 Zuishinさんの言っている通り、$power.Runが正しいです。
Zuishin

2020/08/27 01:59

$power.Run はコマンドレットではなく COM メソッドなので呼び出し方が違います。$power.Run "macro1" x ではなく、$power.Run("macro1", $x) です。
SAMUSAMUN

2020/08/27 02:23

何度も申し訳ございません。 $power.Run("macro1", $x)に変更し、実行すると、 型は ByRef であってはなりません と出てくるのですが、ご教授いただけないでしょうか。 よろしくお願いいたします。
SAMUSAMUN

2020/08/27 05:03

ご丁寧にありがとうございます。 まだ解決はしてませんが、参考に考えてみます。
Zuishin

2020/08/27 05:08 編集

考える前にエラーメッセージを正確に読みましょう。という意見です。リンク先を読めばわかると思いますが、マクロ側の問題だと思います。 これだけ繰り返して強調しても読まないことに驚きを隠せません。
SAMUSAMUN

2020/08/27 05:33

言葉足らずで申し訳ございません。 上記リンクを拝読しましたが、理解が追いついていないため、 まだ解決はしていませんでした。 ありがとうございます。
Zuishin

2020/08/27 05:37

上記リンクはともかく、くどくどと「正確に読んでください」と言ったのはエラーメッセージです。これを正確に(ななめ読みでなく)読めばどこで何が間違っているか書いてあると思います。
SAMUSAMUN

2020/08/27 06:11

ありがとうございます。 マクロ側でByRefでない型で受け取るのだと考えましたが、 間違えているみたいなので、もう一度正確に読んでみます。 何度もご教授いただきまして大変感謝しております。
yureighost

2020/08/27 08:21

ちなみに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型が引数なだけなので障害が少ないと思います。 どうしても難しい場合はそちらもご検討の程を。
SAMUSAMUN

2020/08/27 15:32

ご丁寧にありがとうございます。 ご教授いただいた方法を2つとも検討してみます。
guest

回答2

0

ベストアンサー

Zuishinさんやtosiさんの回答を参考に、横から私も試してみた所、

  • $power.runはなぜか実行できない(なぜでしょう・・・)
  • $book.Application.Runなら実行OK

という状態でした。


Application.runの定義は
System.Object Run(string MacroName, [ref] Params System.Object[] safeArrayOfParams)
と出てきますが、第二引数からは「Params(可変長引数)」なので0個~複数個渡せます。(.net仕様)
当然ですが何個渡すかは、PowerPoint側マクロ引数の数に依存します。
提示ソースですと不一致ですので、無効な要求です。Sub または Function が定義されていませんとなります。


単にRun("macro1")としても、どのスライドのマクロか特定できないので、

vba

1$book.Application.Run("test.pptm!macro1")

等とすると良いようです。
・・・と書いたものの、特定できる事もあるようなので詳細は分かりません。

投稿2020/08/28 02:49

FKD

総合スコア268

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SAMUSAMUN

2020/08/28 11:29

ご回答ありがとうございました。 ご指摘いただいた通りにすると実行することができました。 大変ありがとうございます。 皆様よりたくさんのご指摘いただきましたが、解決したということで、 ベストアンサーとさせていただきます。
guest

0

これでどうですか。

PS

1#(Test_Sample_Miniature) 2$file = "C:Users/Documents/sample.pptm" 3$power = New-Object -ComObject PowerPoint.Application 4$x = "a" 5try { 6 $book = $power.Presentations.Open($file) 7 8 $book.Application.Run("macro1",$x) 9  #$book.Application.Run("macro1") #<---ダメな時はこちらで 10 $book.Close() 11} finally { 12 $power.Quit() 13 [System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($power) | Out-Null 14 [System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($book) | Out-Null 15} 16[GC]::Collect()

投稿2020/08/27 04:29

編集2020/08/27 04:45
tosi

総合スコア553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SAMUSAMUN

2020/08/27 05:05

ありがとうございます。 $book.Application.Run("macro1",$x) $book.Application.Run("macro1") 両方試してみましたが、 無効な要求です。Sub または Function が定義されていません。 と出てくるようです。
tosi

2020/08/27 05:29 編集

そうですか。 標準モジュールへ下記を追加して動かしたら、此方では動作しました。 Sub macro1() MsgBox ("test") End Sub または、 Sub macro1(ByRef xxx As String) MsgBox ("test" & " - " & xxx) End Sub (-環境-) PowerPoint2010(14.0.6203)/Windows10Pro/マクロセキュリティー系抜く (-参考-) http://officetanaka.net/excel/vba/error/compilation_error/error_12.htm
SAMUSAMUN

2020/08/27 05:37

ご丁寧にありがとうございます。 マクロ側の問題とご指摘もいただきましたので、 上記、マクロも試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問