Excel のマクロから PowerShell スクリプトを呼び出そうとしています。
私は次のような例をいくつか見てきました:
retval = Shell("powershell ""C:\MyTest.ps1""", 1)
しかし、これを使用しようとすると:
Sub Connect_01()
Dim x
x = Shell(“powershell.exe ""\\corp\hdq\Path with spaces\PowerShell\Modules\macro01.ps1""", 1)
End Sub
コンパイラ エラーが発生します。 Syntax error
割り当てを削除すると、最初の引用符のペアでエラーが発生します。
Expected: list separator or )"
私は VBA の経験があまりなく、Shell() コマンドの経験も全くないので、どんな助けでもいただければ幸いです。
答え1
これを行うには2番目の方法があります。Windows Script Host のExec
方法。
それは大きな利点があり、値を読み戻す外部の PowerShell、コマンド ライン、またはその他のコマンド ライン ツールから実行できます。Excel と Powershell の間で双方向通信が行われます。
Excelマクロ
Sub RunAndGetCmd()
strCommand = "Powershell -File ""C:\path\to\My PS File.ps1"""
Set WshShell = CreateObject("WScript.Shell")
Set WshShellExec = WshShell.Exec(strCommand)
strOutput = WshShellExec.StdOut.ReadAll
Msgbox strOutput
End Sub
コマンドの他の動作例は、
strCommand = "ping.exe 127.0.0.1"
strCommand = "Powershell Echo Hello World"
My PS File.ps1
私がデモに使用したPowerShellファイルは
echo "Hello World"
$x = 1 + 1
echo $x
echo
PowerShellファイルまたはコマンドラインツールから結果を取得する限り、PowerShellで複雑な操作をすべて実行できます。つまり、次のように記述します。標準出力(標準出力)。スクリプトが終了すると、ExcelはWshShellExec.StdOut.ReadAll
スペースを含むパスがExcelからPowerShellに適切に渡されるようにするには、パスを4つの二重引用符で囲みます。"powershell -file ""C:\my path\"" "
Excelでの結果
注意点
- Wscriptsメソッドとは異なり
Run
、このExec
メソッドではコマンドラインウィンドウを非表示にすることはできません。 - ループを使用した場合、安定した結果が得られませんでした。MicrosoftのMSDN記事に掲載外部コマンドラインツールが終了したかどうかを確認する
使用されたリソース
答え2
の代わりにこれを使ってみてください1
。1がどこから来るのかわかりません -
Sub Connect_01()
Dim x as Variant
x = Shell("POWERSHELL.EXE " & "\\corp\hdq\Path with space\PowerShell\Modules\macro01.ps1", vbNormalFocus)
End Sub
あるいは、それをすべて除外する -
Sub Connect_01()
Dim x
x = Shell("POWERSHELL.EXE " & "\\corp\hdq\Path with space\PowerShell\Modules\macro01.ps1")
End Sub
答え3
このスレッドの OP 部分では、コードに閉じ括弧がありません。そのため、「予期されるもの: リスト区切り文字または )"」というエラーが発生します。x
=SHELL( を使用する回答では、次の 2 つのいずれかを試してください。1) & の前後のスペースを削除します。2) & を使用する代わりに、+ を使用します。
答え4
PowerShell のフルパスではなく、POWERSHELL.EXE を使用してください。私の場合、フルパスは C:\Windows\syswow64\WindowsPowerShell\v1.0\PowerShell.exe です。