2021年4月7日水曜日

Powershell+Excel VBA周りの( ..)φメモメモ

Excel VBAから引数を渡す.ps1スクリプトを呼び出してExcelマクロで全体の処理をハンドリングするための材料調査。

という事でそこそこ簡単に実現できそうだ。

調べた内容は次の二点。

やりたい事①:VBAからのPS1スクリプト呼び出し。

やりたい事②:PS1スクリプトで引数を受けるお作法

やりたい事①:VBAからのPS1スクリプト呼び出し。

↓こちらの方の関数が恐らく完成形。

https://pmp-style.hatenablog.com/entry/VBA_call_PowerShell

Function RunPowerShell(intWindowStyle As Long, bWaitOnReturn As Boolean, psFilePath As String, ParamArray args()) Dim cmdline As String cmdline = Chr(34) & "powershell" & Chr(34) & " -ExecutionPolicy RemoteSigned -File " & Chr(34) & psFilePath & Chr(34) Dim arg As Variant For Each arg In args cmdline = cmdline & " " & Chr(34) & arg & Chr(34) Next Dim objWSH As Object Set objWSH = CreateObject("WScript.Shell") Dim ret As Variant ret = objWSH.Run(cmdline, intWindowStyle, bWaitOnReturn) RunPowerShell = ret End Function

すばらしい。

呼び出しはこんな感じ。

 RunPowerShell(0, True, "C:\example.ps1", "param1")

 第一引数のintWindowStyleを1にするとウィンドウ表示(その他の値はリンク先参照)。

 第二引数のbWaitOnReturnをFalseにすると非同期(ps1スクリプトの終了を待たない)Trueだと待つ。

 第三引数は実行するファイルのフルパス。

 第四引数以降は実行するスクリプトに与える引数を列挙。

という感じでVBAから.ps1が呼び出せる。

マジで素晴らしい。

【後日追記】・・・と思っていたが実際に使用してみるとうまく行かないケースがあったので別途記事執筆

やりたい事②:PS1スクリプトで引数を受けるお作法

C:¥example.ps1 に次の2行だけ記述して保存。

Write-Host $Args[0]
Write-Host $Args[1]
PS C:\> .\example.ps1 "abc" "def"
abc
def
PS C:\>

という感じで、とりあえず使う事は可能。

といっても、名前のない$Args[x]ではなかなかスクリプトの中で値として使うのは気持ち悪い。

代入文を書いておいても良いが名前で宣言も可能な模様。

C:¥example.ps1 を次のように変更。

Param(
[String]$StringParam,
[Int]$IntParam
)
Write-Host $StringParam
Write-Host $IntParam

この場合の与え方と結果は次の通り。

PS C:\> .\example.ps1 -StringParam "abc" -IntParam 1
abc
1
PS C:\>

という事で大体仕組みは分かった。

これらを組み合わせればExcel VBAからパラメータ付きの.ps1スクリプトを呼び出して結果のファイルを使ってみたいな処理が実現できそうである。

0 件のコメント:

ウェブサイトのURLにおけるトレイリングスラッシュの解釈と有無による動作の違い

インターネットが現代社会におけるコミュニケーションの基盤となっている今日、ウェブサイトのURLはビジネスや個人ブランディングにとって重要な役割を果たしています。URLは単にウェブページへの経路を示すだけでなく、SEO(検索エンジン最適化)においても重要な要素です。この記事では、U...