PowerShell VBAでPowerShellを実行して結果を取得する(Exec編)【初実験編07】

2018/10/05PowerShellEXCEL,PowerShellの基本,VBA,Wscript.shell,CreateObject,kernel32

記事内に広告が含まれています。

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】

システムトラストでは一緒に働いていただける仲間を募集中です。
株式会社システムトラスト

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ