PowerShell VBAでPowerShellを実行して結果を取得する(Exec編)【初実験編07】
Excel(VBA)からPowerShellを実行して、結果をセルに出力してみる
VBAからPowerShellを実行するには、WshShellオブジェクトを使用しますが、Execメソッドを使って実行すると、PowerShellの実行画面が表示されてしまい、目障りです。
実行方法には、Execメソッド以外に、Runメソッドを使用する方法もあり、それぞれ下のような特徴があります。
- Runメソッドは、実行するウィンドウを非表示にできますが、Execメソッドではできません。
- Runメソッドは、実行結果を標準出力から拾うことはできませんが、Execメソッドではそれが可能です。
- Runメソッドは、処理の完了を待つことができますが、Execメソッドで完了を判定するには、監視が必要です。
今回はPowerShellの実行画面が表示されてしまうのはあきらめて、比較的簡単に実装できるExecメソッドを使った方法を試してみます。
実行結果は、名前参照を設定した結果出力用のセルを準備し、そこに表示させるように実装します。
過去の投稿「Excel お手軽名前参照」を見て、結果出力用のセルに名前を付けます
("testCell"という名前にしました)
Execメソッドを用いた実装
コマンドボタンを配置して、クリックイベントのSubプロシージャを実装します
スリープを使うので、この宣言が必要です。
' スリープAPIを使用する宣言 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
クリックイベントではこんな感じ。
Sub ボタン1_Click() Dim cmdStr As String Dim strResult As String ' 簡単なコマンドレットの構文を作成(DOSの「dir C:\実験」と同じ) cmdStr = "Get-ChildItem 'C:\実験'" ' PowerShellの実行(Execコマンド使用バージョン) strResult = ExecPowerShell(cmdStr) ' 名前参照セルに、結果を設定する Range("testCell").Value = strResult End Sub
ExecPowerShell()の中身
コマンドを受けて、実行し、終わるのを待って、出力結果を返します
' ************************************************** ' PowerShellの実行(Execコマンド使用バージョン) ' ************************************************** Private Function ExecPowerShell(cmdStr As String) As String ' WshShellオブジェクト Dim oExec As Object ' Execコマンドで実行する ' -NoLogo 著作権の見出しを出さない ' -ExecutionPolicy RemoteSigned 実行権限を設定 ' -Command コマンド引数(これ以降にPowerShellのコマンドレット構文を記載) Set oExec = CreateObject("Wscript.shell").Exec("powershell -NoLogo -ExecutionPolicy RemoteSigned -Command " & cmdStr) ' ジョブが実行中(0)の間は、スリープしながら完了(1)まで待つ Do While oExec.Status = 0 ' 100ミリ秒 Sleep 100 Loop ' 標準出力取得 ExecPowerShell = oExec.StdOut.ReadAll End Function
PowerShellの画面が一瞬現れるので目障りですが、実装は比較的シンプルです。
しかし、処理の完了をsleepを入れて監視する必要があるところは、あまりいい気持ちがしません。
PowerShell Treeをファイルにリダイレクトしてみた【初実験編01】
PowerShell 同一階層のファイル名一覧をテキストファイルにリダイレクトしてみる【初実験編02】
PowerShell 起動方法(Windows10)【初実験編03】
PowerShell ファイル名の一括置換【初実験編04】
PowerShell ファイル検索【初実験編05】
PowerShell 文字列検索【初実験編06】
PowerShell VBAでPowerShellを実行して結果を取得する(Exec編)【初実験編07】
PowerShell VBAでPowerShellを実行して結果を取得する(Run編)【初実験編08】
PowerShell UNIXのシェルやDOSコマンド【初実験編09】