【ExcelVBA】ExcelのマクロからPowershell上でコマンドを実行するには

この記事では、ExcelのマクロからPowershell上でコマンドを実行する方法についてご説明します。

【動画】ExcelのマクロからPowershell上でコマンドを実行する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


まずは、WshShellオブジェクト用インスタンスを生成し、次にPowershell上で実行したいコマンドを用意します。

WshShellオブジェクト用インスタンスのRunメソッドの引数にこのコマンドを指定して実行することでPowershell上でコマンドを実行しています。

ちなみにPowershell上で実行しているのは、現在の日付を取得してCSVファイルに保存するコマンドです。

マクロ作成の流れ

STEP.1
WshShellオブジェクト用インスタンスを生成する
WshShellオブジェクト用インスタンスを生成します。
このWshShellオブジェクト用インスタンスは、Powershellを呼び出してコマンドを実行するRunメソッドを実行するのに必要です。
STEP.2
Powershell上で実行したいコマンドを用意する
Powershell上で実行したいコマンドを用意します。
STEP.3
WshShellオブジェクト用インスタンスのRunメソッドの引数にSTEP.2のコマンドを指定して実行する
WshShellオブジェクト用インスタンスのRunメソッドの引数にSTEP.2のコマンドを指定して実行します。
Runメソッドが実行されると、Powershell上でコマンドが実行されます。

コードの例

Option Explicit

Sub test()

    Dim oShell  As WshShell          'WshShellオブジェクト用変数
    Dim strCmd  As String            'コマンド用変数
    Dim csvFile As String            '出力するCSVファイルのフルパス用変数
    
    'WshShellオブジェクト用インスタンスを生成する
    Set oShell = CreateObject("WScript.Shell")
    
    'Powershellで実行する、現在の日付を取得するコマンドを変数strCmdに格納する
    strCmd = "(Get-Date).ToString('yyyy/MM/dd')"
    
    'CSVファイルをフルパスで取得する(保存先はマクロのExcelファイルと同じ場所)
    csvFile = ThisWorkbook.Path & "\date.csv"
    
    'PowerShellを呼び出してコマンドを実行する(実行して取得した現在の日付をCSVファイルに書き出して保存する)
    oShell.Run "powershell -Command " & strCmd & " | Out-File " & csvFile, 0, True
    
    '後処理
    Set oShell = Nothing
    
End Sub

注目すべきコード①

最初に見て頂きたいのは10行目です。

    'WshShellオブジェクト用インスタンスを生成する
    Set oShell = CreateObject("WScript.Shell")

コードの説明

このコードは、WshShellオブジェクト用インスタンスを生成するコードです。

このインスタンスは、Powershellを呼び出してコマンドを実行するRunメソッドを実行するのに必要です。

注目すべきコード②

次に見て頂きたいのは13行目です。

    'Powershellで実行する、現在の日付を取得するコマンドを変数strCmdに格納する
    strCmd = "(Get-Date).ToString('yyyy/MM/dd')"

コードの説明

このコードは、PowerShell上で実行するコマンドを取得するコードです。

なお、このコードは今回サンプル用に用意したコードで、コードの内容は現在の日付を取得してCSVファイルに保存するコマンドです。

このサンプルコードをPowerShellで実行した画面は下の画像の通りです。

コマンドを実行すると、現在の日付が出力されました。

注目すべきコード③

次に見て頂きたいのは16行目から19行目です。

    'CSVファイルをフルパスで取得する(保存先はマクロのExcelファイルと同じ場所)
    csvFile = ThisWorkbook.Path & "\date.csv"
    
    'PowerShellを呼び出してコマンドを実行する(実行して取得した現在の日付をCSVファイルに書き出して保存する)
    oShell.Run "powershell -Command " & strCmd & " | Out-File " & csvFile, 0, True

コードの説明

以上のコードは、Powershell上でコマンドを実行して取得した結果をCSVファイルに書き出す処理のコードです。

コードの詳細

16行目では、Powershell上でコマンドを実行して取得した結果を書き出すCSVファイルをフルパスで取得します。

19行目では、WshShellオブジェクト用インスタンスのRunメソッドの引数にこのコマンドを指定して実行することでPowershell上でコマンドを実行しています。

コマンドの前に「”powershell -Command “」の文字列を付け、コマンドの後ろに「” | Out-File ” & csvFile」を付けています。

コマンドの前に「”powershell -Command “」の文字列を付けることで、PowerShellのコマンドを実行することができ、「” | Out-File ” & csvFile」はそのコマンドの結果をCSVファイルに出力するという意味です。

なお、Runメソッドの第2引数の0は、PowerShell上でコマンドを実行する際、PowerShellのウィンドウは非表示にするという意味です。1ならPowerShellのウィンドウを表示させます。

第3引数のTrueは、同期モードでRunメソッドを実行します。Falseだと非同期モードになります。

「同期/非同期」とは?
「同期/非同期」とは、呼び出したプログラムの終了をExcelのマクロ側が待つかどうかのことを指します。
同期(True):呼び出したプログラムの終了をExcelのマクロ側が待つ
非同期(False):呼び出したプログラムの終了をExcelのマクロ側が待たない

動作確認

マクロを実行すると、以下のフォルダに「date.csv」というCSVファイルが生成されました。

「date.csv」のファイルを見てみると、現在の日付が出力されており、Powershell上でコマンドが正しく実行されたことが確認できました。

最後に

本記事では、ExcelのマクロからPowershell上でコマンドを実行する方法についてご説明しました。

ExcelのマクロからPowershell上でコマンドを実行させたいというときは本記事を参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら