見出し画像

Excel から PowerShell を 実行する方法

この前作ったExcelマクロの紹介

昨日、なんとか完成させたExcelマクロは、SeleniumBasicのWebDriverの自動アップデートさせるやつの改良?(退化かもしれん、いや退化だな。)をしました。どんな、マクロなのか、録画した映像をペタリンコします。

もし、SeleniumBasicがインストールされていないなら、インストールソフトをダウンロードさせて、インストールを実行させます。そのあと、パソコンにインストールされたEdgeのバージョンで動く、WebDriverをダウンロードしてインストールしています。おおもとの仕組みは、やまとさんのアイディアです。
それを自分なりに改造(PowerShell化)したものです。

Excel VBA から PowerShell を使う為の準備

最初に。
ここから書く内容を理解するには、ある程度アプリやツールを開発した経験がある人であることを前提に書きます。申し訳ございません。
(でないと、膨大な記事になっちゃうからね💦)

参照設定をする(絶対では無い)

人によっては、CreateObject 派 も人もいます。
私は、参照設定がほとんどですね。ま、下のライブラリを設定しましょう。
Windows Script Host Object Model (以下 WSH)
(C:\Windows\System32\wshom.ocx)
WSHの参照設定は必須です。これがないと、結果を取得できなかったりと不便です。ま、これだけです
あとは、Google先生ですかね・・・

VBA から PowerShell を使う時の 注意点

  • 基本的に、Windows 10 以降 のみ

  • PowerShell の バージョンに注意

この2個だけが、注意点ですかね。たぶん。
Server系のOSなら昔からあったようですが、基本は、Windows 10からです。よって、Windows 10 未満のWindows PC では動作しません。ご注意願います。
それと、PowerShell のバージョンです。自分は、困った経験はありませんが、バージョン違いによるトラブルって、結構、多いみたいです。

VBA コード

お待ちかねのソースコードですが、PowerShellを使うところだけ、紹介します。

Public Sub Extract(DLFilePath As String)
    
    Dim CommandText As String
    CommandText = "Expand-Archive -Path '" & DLFilePath & "' -DestinationPath '" & DL_EDGE_DRIVER_FOLDER & "' -Force" & vbNewLine
    
    Dim wsh As New WshShell
    Dim wshExe As WshExec
    Set wshExe = wsh.Exec("powershell -ExecutionPolicy RemoteSigned -Command %{" & CommandText & "}")
    Do While wshExe.Status = 0
        DoEvents
    Loop
    
    Set wsh = Nothing
    Set wshExe = Nothing
    
End Sub

これは、zip ファイルを VBA で解凍するコードです。
VBAからPowerShellを操作する場合、操作したいコードを、Stringの変数にコマンドを代入する方法が一般的です。
理由は明確でして、複数行での命令が一般的だからです。今回の事例は1行ですが💦
とりま、重要なところだけ簡単に。

CommandText = "Expand-Archive -Path '" & DLFilePath & "' -DestinationPath '" & DL_EDGE_DRIVER_FOLDER & "' -Force" & vbNewLine

Expand-Archive が、zipファイルを解凍する命令文です。
-Path が 解凍する zipファイルのパス名を指定するためのパラメータです。すぐ後ろに、パス名を変数で指定しています。
-DestinationPath が 解凍するフォルダを指定しています。
-Force は、実行中の画面を出す感じにするおまじないです。(たぶん)

Dim wsh As New WshShell
Dim wshExe As WshExec
Set wshExe = wsh.Exec("powershell -ExecutionPolicy RemoteSigned -Command %{" & CommandText & "}")
Do While wshExe.Status = 0
    DoEvents
Loop

この記述は、ワンセットで、使う感じが多いです。
今回の事例の場合は、インターネットからファイルをダウンロードします。一応、デジタル署名を要求して署名されたスクリプトを信頼して実行するために書いています。そのセキュリティレベルを指定しています。
-ExecutionPolicy RemoteSigned
最後に、-Commandプロパティです。実行したいコマンドを記述します。
事例では、%{ ・・・ } で囲んでいますが、これは、複数行の命令実行の時に必要になります。ま、1行でも問題く動きますので、これで覚えています。

ま、難しい事は、さておき、VBAからPowerShellを動かしたい場合、こんな呪文を書くのねって感じで良いと思います。

でも、今回なぜPowerShell に?

ダウンロードフォルダを取得するためです!

あぁぁぁ、聞こえるぅ~。
"C:" & Environ("HOMEPATH") & "\Downloads
これでいいじゃん!
でもさぁ、Environ関数って、ダウンロードフォルダを取得できない知っていました?出来ないんですよ。
だったら、PowerShellで取得したいと思ったのです。

powershell -ExecutionPolicy RemoteSigned -Command (New-Object -ComObject Shell.Application).NameSpace('shell:Downloads').Self.Path

これで、ダウンロードフォルダを取得できます。
ねっ、良いでしょ、PowerShell !
この記事をきっかけに、PowerShell を触ってほしいと思います。
VBAでできることの範囲が広がるはずです!

最後に

PowerShell は、ずぶの素人です。しかし、有識者の記事がインターネットに豊富にあるのが救いです。
使い方次第では、救世主になるかもです。
でも、本心は、乱用を避けるべきかと思います。
どうしても、デキナイ!と思った時の最後の手段と考えるべきかと思います。
ここまで、読んでくださった方、ありがとうございます。

この記事が気に入ったらサポートをしてみませんか?