webdevqa.jp.net

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()コマンドの経験もないので、助けていただければ幸いです。

6
Number8

これを行う2つ目の方法があります。 Windows Script HostのExec method を使用します。

外部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"

デモするPowerShellファイルMy PS File.ps1

echo "Hello World"
$x = 1 + 1
echo $x

PowerShellファイルまたはコマンドラインツール内から結果をechoする限り、PowerShellですべての複雑なことを実行できます。これは、StdOut(標準出力)に書き込むことを意味します。スクリプトが終了すると、ExcelはWshShellExec.StdOut.ReadAllを使用してすべての値を読み取ります。

スペースを含むパスがExcelからPowerShellに正しく渡されるようにするには、パスを4つの二重引用符で囲みます"powershell -file ""C:\my path\"" "

Excelでの結果

enter image description here

注意事項

  • Wscripts Runメソッドとは異なり、Execメソッドはコマンドラインウィンドウを非表示にできません
  • MicrosoftのMSDN記事でループを show として使用して外部コマンドラインツールが終了したかどうかを確認すると、安定した結果を得ることができませんでした

使用されたリソース

10
nixda

このスレッドのOP部分では、コードに右括弧がありません。そのため、エラー: '予想:リスト区切り記号または) "'。
x = Shell(、2つのことを試してみてください。1)の前後のスペースを削除してください。 2)&を使用する代わりに、+を使用してみます

0
just some guy

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
0
Raystafarian