Excel マクロから PowerShell スクリプトを呼び出す

Excel マクロから PowerShell スクリプトを呼び出す

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

echoPowerShellファイルまたはコマンドラインツールから結果を取得する限り、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 です。

関連情報